2016-06-30 16 views
2


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 ; 

Antwort

0

diese wawy für Fall

INSERT INTO DB.table_destination(field1, field2) 
SELECT CASE fieldAA WHEN 'value1' THEN fieldA ELSE fieldC END , 
     CASE fieldAA WHEN 'value1' THEN fieldB ELSE fieldD END 
FROM db.table_source 

Wenn ich das richtig verstanden, Sie hinterfragen und Sie führen Sie Ihre Einsatz nur wählen, wenn ID_SITE null ist, dann sollten Sie

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) 
AND ID_SITE is null ; 

verwenden können Sie beide Fall verwenden, wenn null ist

INSERT INTO DB.table_destination(field1, field2) 
SELECT CASE fieldAA WHEN is null THEN fieldA ELSE fieldC END , 
     CASE fieldAA WHEN 'value1' THEN fieldB ELSE fieldD END 
FROM db.table_source 

oder IFNULL

INSERT INTO DB.table_destination(field1, field2) 
SELECT ifnull(fieldAA, your_column_for_null) , 
     CASE fieldAA WHEN 'value1' THEN fieldB ELSE fieldD END 
FROM db.table_source 
+0

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

+0

Sie möchten die Auswahl nur ausführen, wenn die ID_SITE null ist? Ich habe Update die Antwort – scaisEdge

+0

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