0

我有一个表,其中有一列包含逗号分隔列表中的值,如下所示:

| 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, ',')))

但不幸的是,它没有为我返回任何记录。如果可能的话,知道我该如何处理吗?

4

2 回答 2

2

您可以使用以下查询找到对象 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 的数量所以我认为这对您非常有帮助。

演示

于 2019-07-17T16:48:42.213 回答
0

这里最好的答案是修复您的数据模型,并将您的表标准化为:

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);
于 2019-07-17T15:48:12.603 回答