簡體   English   中英

SQL Server列值分隔條件

[英]SQL Server where condition on column with separated values

我有一個帶有列的表,該列的值可以用“,”分隔。 列組示例:

id column group:

1   10,20,30
2   280
3   20

我想創建一個列組條件為SELECT的地方,我可以在其中搜索20 ad例如,它應該返回1和3行,或者按20,280搜索,並且應該返回1和2行。

你能幫我嗎?

簡短的答案是:不要這樣做。

而是將您的表標准化為至少3NF。 如果您不知道什么是數據庫規范化,則需要閱讀一些內容。

如果絕對必須這樣做(例如,這是一個舊系統,並且無法更改表結構),那么有幾篇關於使用TSQL進行字符串拆分的文章,至少有幾篇文章對各種可用方法進行了廣泛的基准測試(例如,請參見: http://sqlperformance.com/2012/07/t-sql-queries/split-strings

由於您只想搜索,因此您實際上不需要拆分字符串,因此可以編寫如下內容:

SELECT id, list
FROM t
WHERE ','+list+',' LIKE '%,'+@searchValue+',%'

其中t(id int, list varchar(max))是要搜索的表,@ searchValue是要查找的值。 如果需要搜索多個值,則必須將這些值添加到表中並使用聯接或子查詢。

例如,如果s(searchValue varchar(max))是要搜索的值表,則:

SELECT distinct t.id, t.list
FROM t INNER JOIN s 
       ON ','+t.list+',' LIKE '%,'+s.searchValue+',%'

如果需要從ADO.Net傳遞這些搜索值,請考慮使用表參數。

正如評論中指出的那樣,將多個值存儲在一行中不是一個好主意

提出您的問題時,您可以使用此處拆分字符串函數之一將逗號分隔的值拆分為一個表,然后查詢它們。

create table #temp
(
id int,
columnss varchar(100)
)

insert into #temp
values
(1,'10,20,30'),
(2,   '280'),
(3,   '20')

select * 
from #temp
cross apply
(
select * from dbo.SplitStrings_Numbers(columnss,',')
)b
where item in (20)

id  columnss    Item
1   10,20,30    20
3   20          20

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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