首页 > 解决方案 > 从具有逗号分隔值的内部查询中获取结果 - SQL Server

问题描述

我有一个临时表有两列 - 键和值:

temp_tbl:

key value
---|-----
k1 | a','b

下面是我在 temp_tbl 中存储值的插入脚本:

insert into temp_tbl values ('k1', 'a'+char(39)+char(44)+char(39)+'b');

现在,我想尝试从另一个表(actual_tbl)中获取记录,如下所示:

select * from actual_tbl where field_value in 
(select value from tamp_tbl where key = 'k1');--query 1

但这并没有返回任何东西。

我希望上述查询的行为类似于以下查询:

select * from actual_tbl where field_value in 
('a','b');--query 2

我在查询 1 中哪里做错了?

我正在使用sql 服务器

标签: sql-server

解决方案


我在查询 1 中哪里做错了?

您出错的地方在于未能理解 IN 关键字与子查询与硬编码列表一起使用的方式。

当 IN 子句后跟一个列表时,列表中的每个项目都是一个离散值:

IN ('I am a value', 'I am another value', 'I am yet another value')

当它后面跟着一个子查询时,每一行都会生成一个值。您的临时表只有一行,因此 IN 子句只考虑一个值。无论您如何尝试用逗号和单引号“欺骗”解析器,它都不起作用。SQL Server 解析器太聪明了,不会被欺骗。它将知道单个值'a','b'仍然只是单个值,并且它将查找该单个值。它不会像您尝试做的那样将它们视为两个单独的值。


推荐阅读