条件插入到mysql中

时间:2016-06-30 12:04:04

标签: mysql insert subquery case


我是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 ;  

1 个答案:

答案 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