sql-server - 从具有逗号分隔值的内部查询中获取结果 - 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 服务器。
解决方案
我在查询 1 中哪里做错了?
您出错的地方在于未能理解 IN 关键字与子查询与硬编码列表一起使用的方式。
当 IN 子句后跟一个列表时,列表中的每个项目都是一个离散值:
IN ('I am a value', 'I am another value', 'I am yet another value')
当它后面跟着一个子查询时,每一行都会生成一个值。您的临时表只有一行,因此 IN 子句只考虑一个值。无论您如何尝试用逗号和单引号“欺骗”解析器,它都不起作用。SQL Server 解析器太聪明了,不会被欺骗。它将知道单个值'a','b'
仍然只是单个值,并且它将查找该单个值。它不会像您尝试做的那样将它们视为两个单独的值。
推荐阅读
- c# - C# 等待 Web 服务的线程 CPU 消耗
- java - 使用 Spring MVC、JPA 和 Hibernate 添加 ManyToMany
- wpf - ScrollViewer 的水平 ScrollBar 将固定高度的内容向上推
- javascript - 将标记的模板文字绑定到外部对象
- java - 我无法提供 ViewModel
- json - 将数据帧的多行合并为一条记录
- python - 并行读取 python 搁置对象
- cygwin - 无法让 cygwin 忽略 ZSH 中的回车
- ssl - 如何重现成功的 openssl_verify
- javascript - javascript生成的CSS类不应用样式