我是MySQL(5.1)的新手,我没有实现有条件的"插入"。
对于每条记录,我想从空/目的表中插入相同的列(1和2),从包含多个记录的源表中插入2个字段(A和B)或2个其他字段(C和D)。登记/>
我的查询在这里:
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
我在第二个SELECT周围出错。根据我脚本中的一些微小变化,它有时会抱怨我有一行以上
我暂时坚持这个问题,所以我将非常感谢你的帮助。
[编辑]
非常感谢您的建议!它与这个简单的例子完美配合。
但是,我的研究案例在现实生活中有点复杂,因为我必须处理3个源表,包括tables_source_1和table_source_2之间的一个条件(JOIN),以及table_source_1和table_source_3之间的一个空间函数。 / p>
这里我的查询只返回一个条件的结果:
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包含SHAPE(空间函数GISWithin中使用的几何)和insee_zerofill。
2)DEMO_OISEAUX9_FULL_CORE包含GPS_TEL_LNG&amp; GPS_TEL_LAT(当METHODE_LOC等于13时填充),ID_SITE(当METHODE_LOC与13不同时填充)。
3)odk.site_clone包含INSEE_zero,LONG_LIEU_DIT,LAT_LIEU_DIT。
我试图在WHERE条件中设置一个CASE,告诉它只在ID_SITE为空时执行该函数,但到目前为止没有成功。
有任何想法吗?
在此先感谢!
[编辑2]
现在,它的作品!我应该重复CASE中的具体条件,以便选择EACH字段,如下所示:
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 :(得分:0)
对于案件而言,这是一种感觉
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时执行你的插入选择那么你应该使用
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
或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