如何修改查询
SELECT field1, field2 FROM table1 WHERE field1 IN ('value1', 'value2', 'value3');
如果找不到'value2',将NULL
作为 field2 ?
表1:
field1 | field2
-------+--------
value1 | result1
value3 | result3
value4 | result4
当前输出:
field1 | field2
-------+--------
value1 | result1
value3 | result3
预期输出:
field1 | field2
-------+-------
value1 | result1
value2 | NULL
value3 | result3
答案 0 :(得分:3)
对包含'完整输出设置'的表使用 LEFT JOIN 。 IN
子句(实际上,WHERE
中的任何条件)只能过滤/删除结果:它永远不会添加新记录。
取决于SQL的味道;一个例子:
SELECT
fullSet.field1,
t.field2
FROM (SELECT 'value1' as field1 -- set of rows value1..4
UNION ALL
SELECT 'value2'
UNION ALL
SELECT 'value3'
UNION ALL
SELECT 'value4') fullSet
LEFT JOIN table1 t -- join to access t.field2 (null if no match)
ON t.field1 = fullSet.field1
WHERE t.field1 IN ('value1', 'value2', 'value3'); -- filtered value4
不同的SQL方言可以提供更方便的方法来构建整个结果集空间(例如,SQL Server中的CTE)。
答案 1 :(得分:2)
如果您使用Postgres,那么我会将其写为:
SELECT v.field1, t1.field2
FROM (VALUES ('value1'), ('value2'), ('value3')) v(field1) LEFT JOIN
table1 t1
ON t1.field1 = v.field1;
如果你使用MySQL,答案是类似的,但第一个表的构造看起来有点不同:
SELECT v.field1, t1.field2
FROM (SELECT 'value1' as field1 UNION ALL
SELECT 'value2' as field1 UNION ALL
SELECT 'value3' as field1
) v LEFT JOIN
table1 t1
ON t1.field1 = v.field1;
在这两种情况下,您都不需要WHERE
条款。