我试图阻止复杂的子选择的结果,该子选择被用作较大的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
答案 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 ...), '')
);