Ich bin ziemlich Neuling mit MySQL (5.1) und ich nicht erreichen, eine bedingte "einfügen in".
Für jeden Datensatz, ich möchte in die gleichen Spalten (1 und 2) aus einer leeren/Zieltabelle, entweder 2 Felder (A und B) oder 2 andere Felder (C und D) aus einer Quelltabelle mit mehreren Datensätzen einfügen .
Hier meine Frage:
bedingte einfügen in mysql
INSERT INTO DB.table_destination(field1, field2)
SELECT
CASE
WHEN fieldAA='value1' THEN (
SELECT fieldA, fieldB
FROM DB.table_source<BR>
)
ELSE (
SELECT fieldC, fieldD
FROM DB.table_source
)
END
FROM db.table_source
Beachten Sie, dass der fieldAA auch zum table_source gehört.
Ich habe einen Fehler um den zweiten SELECT. Abhängig von einigen kleinen Änderungen in meinem Skript beschwert es sich manchmal, dass ich mehr als eine Zeile habe.
Ich bin für eine Weile auf dieses Problem fest, so werde ich Ihre Hilfe sehr schätzen.
[EDIT]
Vielen Dank für Ihre Ratschläge! Es funktioniert perfekt mit diesem einfachen Beispiel. Mein Studienfall ist jedoch im wirklichen Leben etwas komplexer, da ich mich mit 3 Quelltabellen auseinandersetzen muss, einschließlich einer Bedingung (JOIN) zwischen tables_source_1 und table_source_2 und einer räumlichen Funktion zwischen table_source_1 und table_source_3.
Hier meine Frage, die mir das Ergebnis von nur einer Bedingung zurückgibt:
INSERT INTO test.OBSERVATION (CODE_INSEE,ID_SITE,LONGWGS84,LATWGS84)
SELECT
CASE METHODE_LOC WHEN '13' THEN insee_zerofill ELSE INSEE_zero END,
CASE METHODE_LOC WHEN '13' THEN '' ELSE ID_SITE END,
CASE METHODE_LOC WHEN '13' THEN GPS_TEL_LNG ELSE LONG_LIEU_DIT END,
CASE METHODE_LOC WHEN '13' THEN GPS_TEL_LAT ELSE LAT_LIEU_DIT END
FROM odk.test_insee, odk.site_clone RIGHT JOIN odk.DEMO_OISEAUX9_FULL_CORE ON odk.site_clone.ID_SITE=odk.DEMO_OISEAUX9_FULL_CORE.SITE_OBS
WHERE odk.GISWithin(GeomFromText(CONCAT('POINT(',GPS_TEL_LNG,' ',GPS_TEL_LAT,')')), SHAPE)
Tabellen Details
1) odk.test_insee enthält SHAPE (Geometrie in der räumlichen Funktion GISWithin verwendet) und insee_zerofill.
2) DEMO_OISEAUX9_FULL_CORE enthält GPS_TEL_LNG & GPS_TEL_LAT (gefüllt, wenn METHOD_LOC gleich 13 ist), ID_SITE (gefüllt, wenn METHOD_LOC von 13 verschieden ist).
3) odk.site_clone enthält INSEE_zero, LONG_LIEU_DIT, LAT_LIEU_DIT.
Ich habe versucht, ein CASE in der WHERE-Bedingung zu setzen, um es zu sagen, um die Funktion nur auszuführen, wenn ID_SITE null ist, aber bisher ohne Erfolg. Irgendwelche Ideen? Vielen Dank im Voraus!
[EDIT 2]
Jetzt funktioniert es!Ich sollte die spezifische Voraussetzung innerhalb des CASE für jedes Feld auszuwählen wiederholt, wie folgt:
SELECT
CASE METHODE_LOC WHEN '13' THEN
(SELECT insee_zerofill
FROM odk.test_insee, odk.DEMO_OISEAUX9_FULL_CORE
WHERE odk.GISWithin(GeomFromText(CONCAT('POINT(',`GPS_TEL_LNG`,' ',`GPS_TEL_LAT`,')')), SHAPE) )
ELSE
(SELECT INSEE_zero
FROM odk.site_clone RIGHT JOIN odk.DEMO_OISEAUX9_FULL_CORE
ON odk.site_clone.ID_SITE=odk.DEMO_OISEAUX9_FULL_CORE.SITE_OBS
WHERE odk.DEMO_OISEAUX9_FULL_CORE.SITE_OBS is not NULL )
END,
CASE METHODE_LOC WHEN '13' THEN ''
ELSE
(SELECT ID_SITE
FROM odk.site_clone RIGHT JOIN odk.DEMO_OISEAUX9_FULL_CORE
ON odk.site_clone.ID_SITE=odk.DEMO_OISEAUX9_FULL_CORE.SITE_OBS
WHERE odk.DEMO_OISEAUX9_FULL_CORE.SITE_OBS is not NULL )
END,
CASE METHODE_LOC WHEN '13' THEN
(SELECT GPS_TEL_LNG
FROM odk.test_insee, odk.DEMO_OISEAUX9_FULL_CORE
WHERE odk.GISWithin(GeomFromText(CONCAT('POINT(',`GPS_TEL_LNG`,' ',`GPS_TEL_LAT`,')')), SHAPE) )
ELSE
(SELECT LONG_LIEU_DIT
FROM odk.site_clone RIGHT JOIN odk.DEMO_OISEAUX9_FULL_CORE
ON odk.site_clone.ID_SITE=odk.DEMO_OISEAUX9_FULL_CORE.SITE_OBS
WHERE odk.DEMO_OISEAUX9_FULL_CORE.SITE_OBS is not NULL )
END,
CASE METHODE_LOC WHEN '13' THEN
(SELECT GPS_TEL_LAT
FROM odk.test_insee, odk.DEMO_OISEAUX9_FULL_CORE
WHERE odk.GISWithin(GeomFromText(CONCAT('POINT(',`GPS_TEL_LNG`,' ',`GPS_TEL_LAT`,')')), SHAPE) )
ELSE
(SELECT LAT_LIEU_DIT
FROM odk.site_clone RIGHT JOIN odk.DEMO_OISEAUX9_FULL_CORE
ON odk.site_clone.ID_SITE=odk.DEMO_OISEAUX9_FULL_CORE.SITE_OBS
WHERE odk.DEMO_OISEAUX9_FULL_CORE.SITE_OBS is not NULL )
END
FROM odk.DEMO_OISEAUX9_FULL_CORE ;
ich meine Frage bearbeitet, basierend auf Ihre Ratschläge vor ein paar Tagen, aber ich bin immer noch wegen der Funktionen steckte ich in der WHERE-Bedingung verwenden. Kann ich bitte extra Hilfe haben? Vielen Dank! – RemiC
Sie möchten die Auswahl nur ausführen, wenn die ID_SITE null ist? Ich habe Update die Antwort – scaisEdge
Nicht genau. Ich habe 1 Haupttabelle (DEMO_OISEAUX), wo die Datensätze aus einem Formular gefüllt werden, ich möchte diese Datensätze in eine neue Tabelle einfügen (Observation) und füllen die CODE_INSEE, LONGWGS84 und LATWGS84 Felder mit Werten aus der site_clone Tabelle (wenn Methode_loc ist NOT gleich 13 Bedeutung ID_SITE ist NICHT null) mit einer JOIN-Funktion, ODER aus der Tabelle test_insee (wenn Methode_loc = 13 Bedeutung ID_SITE ist Null) mit der GISWithin-Funktion. Wenn ich "AND ID_SITE ist null" wie vorgeschlagen hinzufüge, wird nur eine der beiden Bedingungen im CASE berücksichtigt (wenn Methode_loc = 13). Danke im Voraus! – RemiC