[英]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.