使用逗号搜索字符串中的特定值

时间:2016-10-21 09:31:29

标签: sql regex sql-server-2005

我的表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开头。

3 个答案:

答案 0 :(得分:2)

第一个建议是修复您的数据结构。在字符串中存储id列表是一个坏主意:

  • 您将数字存储为字符串。这是错误的表现形式。
  • 您正在字符串列中存储多个值。那不是正确使用SQL。
  • 这些值可能是ID。您无法声明正确的外键关系。
  • SQL没有特别强大的字符串函数。
  • 生成的查询无法利用索引。

尽管如此,有时我们仍然坚持其他人糟糕的设计决定。

在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'