我的表T中有一个TEXT列,包含一些以逗号分隔的值。
实施例
列BNFT具有文本值,例如
B20,B30,B3,B13,B31,B14,B25,B29,B1,B2,B4,B5
OR
B1,B2,B34,B31,B8,B4,B5,B33,B30,B20,B3
我想仅在B3存在时才在我的查询中返回结果。 它不应该考虑B30-B39或B [1-9] 3(即B13,B23 ...... B93)。
我尝试使用下面的查询,但是想要实现REGEXP或REGEXP_LIKE / INSTR等。之前没有使用它们而且也无法理解。
Select *
FROM T
Where BNFT LIKE '%B3,%' or BNFT LIKE '%B3'
请指教
程序无效。查询必须以Select as 1st statement开头。
答案 0 :(得分:2)
第一个建议是修复您的数据结构。在字符串中存储id列表是一个坏主意:
尽管如此,有时我们仍然坚持其他人糟糕的设计决定。
在SQL Server中,您可以这样做:
where ',' + BNFT + ',' LIKE '%,33,%'
此问题最初标记为MySQL,为此目的提供find_in_set()
:
Where find_in_set(33, BNFT) > 0
答案 1 :(得分:0)
Select *
FROM T
Where ',' + BNFT + ',' LIKE '%,B3,%';
或
Select *
FROM T
Where CHARINDEX (',B3,',',' + BNFT + ',') > 0;
答案 2 :(得分:0)
This can be easily achieve by CTE, REGEXP/REGEXP_Like/INSTR works better with oracle, for MS SQL Server you can try this
DECLARE @CSV VARCHAR(100)='B2,B34,B31,B8,B4,B5,B33,B30,B20,B3'; SET @CSV = @CSV +',';
WITH CTE AS ( SELECT SUBSTRING(@ CSV,1,CHARINDEX(',',@ CSV,1)-1)AS VAL,SUBSTRING(@ CSV,CHARINDEX(',',@ CSV,1)+ 1,LEN(@CSV)) AS REM UNION ALL SELECT SUBSTRING(A.REM,1,CHARINDEX(',',A.REM,1)-1)AS VAL,SUBSTRING(A.REM,CHARINDEX(',',A.REM,1)+ 1,LEN( A.REM)) 从CTE A LERE LEN(A.REM)> = 1 )从CTE中选择VAL VAL ='B3'