[英]Get Distinct value from a list in SQL Server
我有一個帶有逗號分隔列表的 DB 列:
VALUES ID
--------------------
1,11,32 A
11,12,28 B
1 C
32,12,1 D
當我運行我的 SQL 語句時,在我的WHERE
子句中,我嘗試了IN
、 CONTAINS
和LIKE
不同程度的錯誤和成功,但沒有一個提供我需要的確切回報。
我需要的是一個 where 子句,如果我要在列表中查找所有值為“1”(不是數字)的 ID。
問題示例:
WHERE
值如 (1)
這將返回 A,B,C,D 因為值 (11) 中包含 1。 我希望 ID(A,C,D)。
WHERE
值如 (2)
這將返回 A,B,D,因為 2 包含在值 (32,28,12) 中。 我希望零記錄。
在此先感謝您的幫助!
我將通過引用上面@Jarlh 給出的現場評論開始我的回答:
永遠不要將數據存儲為逗號分隔的項目。 只會給你帶來很多麻煩。
話雖這么說,如果你真的堅持這種設計,你可以使用:
SELECT *
FROM yourTable
WHERE ',' + [VALUES] + ',' LIKE '%,1,%';
這里的技巧是將每個VALUES
轉換為如下所示的內容:
,11,12,28,
然后,我們可以搜索兩邊都帶有逗號分隔符的目標編號。 由於我們在兩端放置了逗號,因此現在可以保證 CSV 列表中的每個數字周圍都有逗號。
如果您遇到如此糟糕的數據 model,我建議:
select t.*
from t
where exists (select 1
from string_split(t.values, ',') s
where s.value = 1
);
正是我回應了 jarlh 和 Tim 所說的。 關系 model 不是在表中存儲逗號分隔字符串的正確位置。
這是一種方法,如果 x 列上有索引,則可能會使用索引
select distinct x
from t
cross apply string_split(t.x,',')
where value=1 /*out here you may parameterize, and also could make use of an index each if there is one in value*/
+---------+
| x |
+---------+
| 1 |
| 1,11,32 |
| 32,12,1 |
+---------+
工作示例https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=b9b3084f52b0f42ffd17d90427016999
--SQL Server 舊版本
with data
as (
SELECT t.c.value('.', 'VARCHAR(1000)') as val
,y
,x
FROM (
SELECT x1 = CAST('<t>' +
REPLACE(x , ',', '</t><t>') + '</t>' AS XML)
,y
,x
FROM t
) a
CROSS APPLY x1.nodes('/t') t(c)
)
select x,y
from data
+---------+
| x |
+---------+
| 1 |
| 1,11,32 |
| 32,12,1 |
+---------+
工作示例https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=011a096bbdd759ea5fe3aa74b08bc895
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.