保持SQL'IN'运算符的值

时间:2017-06-10 06:04:54

标签: sql

如何修改查询

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

2 个答案:

答案 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条款。