SQL服务器:如何检查列中的值是否与子查询中的所有值匹配?
SQL Server: How to check if values in a column match ALL the values from a subquery?
我有一个 table,其中有一列包含以逗号分隔的列表中的值,如下所示:
| ObjectID (int) | Column1 (nvarchar(max))|
| 1 | 152, 154, 157, 158 |
| 2 | 101, 154, 155 |
| 3 | 97, 98, 99 |
我需要 select 具有 Column1 的所有 ObjectID 以及在特定字符串中找到的所有整数值:“155、154”。这样,只有 ObjectID = 2 的行应该被 returned,因为它在其 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, ',')))
但不幸的是,它没有 return 我的任何记录。如果可能的话,知道我该如何处理吗?
此处最好的答案是修复您的数据模型,并将您的 table 规范化为:
ObjectID | Column1
1 | 152
1 | 154
1 | 157
1 | 158
2 | 101
2 | 154
2 | 155
3 | 3
3 | 97
3 | 98
3 | 99
现在您的查询可以简化为:
SELECT ObjectID
FROM yourUpdateTable
WHERE Column1 IN (155, 154)
GROUP BY ObjectID
HAVING MIN(Column1) <> MAX(Column1);
您可以使用以下查询找到对象 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的个数
所以我认为这对你很有帮助。
我有一个 table,其中有一列包含以逗号分隔的列表中的值,如下所示:
| ObjectID (int) | Column1 (nvarchar(max))|
| 1 | 152, 154, 157, 158 |
| 2 | 101, 154, 155 |
| 3 | 97, 98, 99 |
我需要 select 具有 Column1 的所有 ObjectID 以及在特定字符串中找到的所有整数值:“155、154”。这样,只有 ObjectID = 2 的行应该被 returned,因为它在其 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, ',')))
但不幸的是,它没有 return 我的任何记录。如果可能的话,知道我该如何处理吗?
此处最好的答案是修复您的数据模型,并将您的 table 规范化为:
ObjectID | Column1
1 | 152
1 | 154
1 | 157
1 | 158
2 | 101
2 | 154
2 | 155
3 | 3
3 | 97
3 | 98
3 | 99
现在您的查询可以简化为:
SELECT ObjectID
FROM yourUpdateTable
WHERE Column1 IN (155, 154)
GROUP BY ObjectID
HAVING MIN(Column1) <> MAX(Column1);
您可以使用以下查询找到对象 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的个数 所以我认为这对你很有帮助。