簡體   English   中英

從 SQL 服務器中的列表中獲取不同的值

[英]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子句中,我嘗試了INCONTAINSLIKE不同程度的錯誤和成功,但沒有一個提供我需要的確切回報。

我需要的是一個 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM