我有一个包含两列的临时表-键和值:
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 server 。
答案 0 :(得分:0)
查询1我在哪里做错了?
您出问题的地方是无法理解IN关键字与子查询或硬编码列表的配合方式。
当IN子句后跟一个列表时,列表中的每个项目都是一个离散值:
IN ('I am a value', 'I am another value', 'I am yet another value')
后跟子查询时,每一行都会生成一个值。您的临时表只有一行,因此IN子句仅考虑一个值。无论您如何尝试用逗号和单引号来“欺骗”解析器,它都将不起作用。 SQL Server解析器太聪明了,不能被欺骗。它将知道'a','b'
的单个值仍然只是单个值,它将查找该单个值。它不会像您尝试的那样将它们视为两个单独的值。