2016-06-30 22 views
2


私はMySQL(5.1)でかなり初心者です。条件付きの「挿入」はできません。
レコードごとに、いくつかのレコードを含むソーステーブルの2つのフィールド(AとB)または2つの他のフィールド(CとD)のいずれかの、空の/宛先テーブルから同じ列(1と2) 。
ここに私のクエリ:
条件付きinsert into 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 


注fieldAAがあまりにもtable_sourceに属していること。
2番目のSELECTの前後にエラーがあります。スクリプトの小さな変更によっては、複数の行があると不平を言うことがあります。
私はしばらくこの問題に悩まされていますので、お手伝いをさせていただきます。

[編集]
ありがとうございました!この単純な例では完全に動作します。 しかし、table_source_1とtable_source_2の間の1つの条件(JOIN)と、table_source_1とtable_source_3の間の1つの空間関数を含む3つのソーステーブルを扱わなければならないので、私の研究ケースは現実にはもう少し複雑です。 1つの条件のみから私に結果を返す
ここ

私のクエリ:

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) 


テーブルは
1)odk.test_inseeはinsee_zerofill SHAPE(ジオメトリの空間関数GISWithinで使用される)とを含んで詳しく説明します。
2)DEMO_OISEAUX9_FULL_COREには、GPS_TEL_LNG & GPS_TEL_LAT(METHODE_LOCが13のときに埋められる)、ID_SITE(METHODE_LOCが13と異なるときに埋められる)が含まれます。
3)odk.site_cloneには、INSEE_zero、LONG_LIEU_DIT、LAT_LIEU_DITが含まれています。

ID_SITEがnullの場合にのみ関数を実行するように指示するためにWHERE条件にCASEを設定しようとしましたが、これまで成功していませんでした。 アイデア ありがとうございます!

[編集2]
今すぐ動作します!以下のように私は、選択するために、各フィールドのCASE内の特定の条件を繰り返している必要があります。

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 ; 

答えて

0

このwawyをケース

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 

のために私はあなたが質問を正しく理解し、あなたの挿入を実行したい場合ID_SITEがnullの場合にのみ、あなたがnull

があるときに、両方のケースを使用することができます

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 ; 

を使用する必要があります選択

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 

または

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

IFNULL私は数日前に、あなたのアドバイスに基づいて私の質問を編集し、私はので、私はWHERE条件で使用する必要がある機能のうち、まだ立ち往生しています。私は余分な助けをお願いしますか?ありがとう! – RemiC

+0

ID_SITEがnullの場合にのみ選択を実行しますか? ii答えを更新してください – scaisEdge

+0

正確ではありません。私は1つのメインテーブル(DEMO_OISEAUX)レコードがフォームから塗りつぶされている、私はそれらのレコードを新しいテーブル(観測)に挿入し、CODE_INSEE、LONGWGS84、LATWGS84のフィールドをsite_cloneテーブルから値を使って埋めたい(Methode_locがGISWithin関数を使用して(Methode_loc = 13意味ID_SITEがnullである場合)、OR test_inseeテーブルから13に等しいID_SITEを意味するnullでない)JOIN機能を使用しません。私が追加「AND ID_SITEがnullである」それは場合にのみ、2つの条件の1(Methode_loc = 13)を検討していく提案されているようならば。前もって感謝します! – RemiC