sql - SQL Server:如何检查列中的值是否与子查询中的所有值匹配?
问题描述
我有一个表,其中有一列包含逗号分隔列表中的值,如下所示:
| ObjectID (int) | Column1 (nvarchar(max))|
| 1 | 152, 154, 157, 158 |
| 2 | 101, 154, 155 |
| 3 | 97, 98, 99 |
我需要选择具有 Column1 的所有 ObjectID,以及在特定字符串中找到的所有整数值:'155、154'。这样,应该只返回 ObjectID = 2 的行,因为它的 Column1 字符串中同时包含 155 和 154 个整数。
我正在尝试这样的事情:
DECLARE @SearchString nvarchar(max) = '155,154';
SELECT *
FROM ObjectsTable
WHERE EXISTS
(SELECT Data FROM dbo.SplitString(Column1, ',')
WHERE Data = ALL (SELECT Data FROM dbo.SplitString(@SearchString, ',')))
但不幸的是,它没有为我返回任何记录。如果可能的话,知道我该如何处理吗?
解决方案
您可以使用以下查询找到对象 ID:
declare @FindText varchar(50)
set @FindText = '155,154'
SELECT Final.ObjectID
FROM (
SELECT Tmp.ObjectID, COUNT(DISTINCT Found.Item) FoundCount
FROM (
SELECT A.ObjectID, A.Column1, B.Item
from ObjectsTable A
outer apply dbo.SplitString(Column1,',') B
) Tmp
OUTER APPLY dbo.SplitString(@FindText,',') Found
WHERE LTRIM(Found.Item) = LTRIM(Tmp.Item)
GROUP BY Tmp.ObjectID
) Final
INNER JOIN (SELECT COUNT(*) FindCount FROM dbo.SplitString(@FindText,',')) AS Fnd ON Fnd.FindCount = Final.FoundCount
这是随着@FindText 中的值变化动态查找objectID 的数量所以我认为这对您非常有帮助。
推荐阅读
- sql - 从不相关的表中一次插入两个或多个值
- react-native - React Native NativeModule.ImagePickermanager 为空
- python - 我应该如何正确使用 unittest.mock.patch 在单元测试中使用假对象?
- r - 闪亮的 RQDA 查询
- mysql - MYSQL JSON - 在其兄弟键值上使用 WHERE 提取部分 JSON 字段
- jmeter - Jmeter请求不断给出403邮递员工作和浏览器工作的地方
- python - 使用 Scrapy 提取数据并遇到 css.seletor 问题
- c# - 在 Blazor 中为客户端和服务器使用相同的授权策略
- vuejs2 - 从 url 更新路由器链接参数
- azure-api-management - Azure API 管理是否具有计量功能 - 例如:按传输的字节数或按 API 调用数衡量?