私は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 ;
IFNULL私は数日前に、あなたのアドバイスに基づいて私の質問を編集し、私はので、私はWHERE条件で使用する必要がある機能のうち、まだ立ち往生しています。私は余分な助けをお願いしますか?ありがとう! – RemiC
ID_SITEがnullの場合にのみ選択を実行しますか? ii答えを更新してください – scaisEdge
正確ではありません。私は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