我的表格中包含varchar
列categoryIds
。它包含一些用逗号分隔的ID,例如:
id categoryIds
--------------------
1 3,7,12,33,43
我想做一个select语句并检查该列中是否存在int。像这样:
select *
from myTable
where 3 in (categoryIds)
我知道这可以通过this在MySQL中实现,但是它也可以在SQL Server中完成吗?
我尝试将int转换为char,它运行以下语句:
select *
from myTable
where '3' in (categoryIds)
但它看起来并不像对逗号分隔的列表有任何“开箱即用”支持,因为它不会返回任何内容。
答案 0 :(得分:12)
您应该重新设计此表,以便将这些值从逗号分隔为单独的行。但是,如果无法做到这一点,那么您将继续进行字符串比较:
DECLARE @id INT = 3
DECLARE @stringId VARCHAR(50) = CAST(@id AS VARCHAR(50))
SELECT *
FROM MyTable
WHERE categoryIds = @stringId -- When there is only 1 id in the table
OR categoryIds LIKE @stringId + ',%' -- When the id is the first one
OR categoryIds LIKE '%,' + @stringId + ',%' -- When the id is in the middle
OR categoryIds LIKE '%,' + @stringId -- When the id is at the end
答案 1 :(得分:3)
SELECT *
FROM myTable
WHERE (',' + RTRIM(categoryIds) + ',') LIKE '%,' + @stringId + ',%'
这里@stringId是您要搜索的文本。通过这种方式,您可以避免不必要的多重条件
亲切的问候, Raghu.M。
答案 2 :(得分:1)
不确定这是否比DavidG的建议更快或更慢,但为了只用一张支票获得相同的匹配,你可以这样做:
DECLARE @categoryId INT
SET @categoryId = 3
SELECT *
FROM myTable
WHERE CHARINDEX(',' + CAST(@categoryId AS VARCHAR(MAX)) + ',', ',' + categoryIds + ',') > 0
答案 3 :(得分:1)
由于尚未提及,因此可以使用 STRING_SPLIT([values], ',') 来实现所需的检查。该函数自 SQL Server 2016 起可用。由于问题的年代久远,我认为没有满足这个条件,这是被问到的时间。
select [id], [categoryIds]
from [myTable]
where '3' in (select values from STRING_SPLIT([categoryIds], ','))
这应该优于上面提到的基于字符串的比较。
答案 4 :(得分:0)
您可以像这样使用动态SQL:
DECLARE @categoryIds nvarchar(50) = '1, 2, 3, 4, 5'
EXEC ('SELECT *
FROM myTable
WHERE categoryId IN (' + @categoryIds + ')')
答案 5 :(得分:0)
SELECT * FROM
user_master
WHERE(user_tags regexp'[[:<:]] 10 [[:>:]]' 或user_tags regexp'[[:<:]] 11 [[:>:]]')
答案 6 :(得分:-4)
使用FIND_IN_SET()
mysql函数
<强>语法强>
SELECT * FROM <table name> as a WHERE FIND_IN_SET(value to search in string,comma separated string);
示例强>
SELECT * FROM <table name> as a WHERE FIND_IN_SET(5,"1,2,3,4,5,6");