在case语句中命名复杂子选择“as”

时间:2014-02-18 14:03:57

标签: sqlite

我试图阻止复杂的子选择的结果,该子选择被用作较大的INSERT语句的一部分,而不是NULL。字段的值必须是空字符串而不是NULL。

总的来说,插入看起来像这样:

INSERT INTO record (id,field1,field2) VALUES (val1,val2,<complex select>);

为防止复数选择为NULL,我可以使用:

SELECT CASE WHEN <complex select> THEN <complex select> else '' end as b

问题是,我不想重复复杂的选择,因为它使查询大两倍,难以阅读,如果查询必须稍微改变等容易出错,所以我想命名选择的结果,所以我可以改为引用该值。但是当我尝试这样做时,我收到一个错误:

SELECT CASE WHEN <complex select> as a THEN a else '' end as b

SELECT CASE WHEN (<complex select> as a) THEN a else '' end as b

错误是:

near "as": syntax error

1 个答案:

答案 0 :(得分:1)

您可以为复杂的列选择一个名称,但要从子查询中获取值,您必须使用另一个SELECT:

INSERT INTO record (id,field1,field2)
VALUES (val1,
        val2,
        (SELECT CASE WHEN a THEN a else '' END
         FROM (SELECT ... AS a FROM ...)
       );

(子查询本身可以给出一个名字,但这里没关系。)

但是,要将NULL值转换为空字符串,您只需使用IFNULL function

INSERT INTO record (id,field1,field2)
VALUES (val1,
        val2,
        IFNULL((SELECT ...), '')
       );