SQL查询where子句in关键字含表不存在值时如何返回指定行?
需求说明
我有一张表,其中一列名为ID。我会在查询时传入一组值和ID列做匹配,希望如果该值在表中有对应记录,则返回匹配行;如果该值不存在于表中,也需要返回该值,其余列显示为空。
示例场景
现有一张包含ID和Animal两列的临时表#Temp1,共有8条记录。
原常用写法如下:
SELECT ID, Animal from #Temp1 where ID in (4,8,12)
该写法只会返回表中存在的ID=4、ID=8的两条记录,无法返回不存在的ID=12的行,不符合需求。
实现方案
不要用WHERE IN做过滤,改用左连接的方式实现:先把你要查询的所有ID构造为一个独立的结果集作为左表,再和原数据表做左连接,左表的所有ID都会保留,原表匹配不到的字段会自动返回空值。
通用写法(兼容所有关系型数据库)
SELECT v.id, t.Animal FROM ( SELECT 4 AS id UNION ALL SELECT 8 UNION ALL SELECT 12 ) v LEFT JOIN #Temp1 t ON v.id = t.ID
简化写法(适配MySQL 8.0+/PostgreSQL/SQL Server 2008+)
可以直接用VALUES构造ID列表,写法更简洁:
SELECT v.id, t.Animal FROM (VALUES ROW(4), ROW(8), ROW(12)) v(id) LEFT JOIN #Temp1 t ON v.id = t.ID
动态ID列表场景
如果ID是动态传入的逗号分隔字符串,可先拆分字符串为临时结果集再关联,以SQL Server为例:
SELECT v.value AS id, t.Animal FROM STRING_SPLIT('4,8,12', ',') v LEFT JOIN #Temp1 t ON CAST(v.value AS INT) = t.ID
内容的提问来源于stack exchange,提问作者Vaishnavi Srinivas
相关产品推荐
相关产品推荐

