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

Search for a particular value in a string with commas

我的 Table T 中有一个 TEXT 列,其中包含一些用逗号分隔的值。

Example
Columns BNFT has text values such as

B20,B30,B3,B13,B31,B14,B25,B29,B1,B2,B4,B5
OR 
B1,B2,B34,B31,B8,B4,B5,B33,B30,B20,B3   

I want to return result in my query only if B3 is present. It should not consider B30-B39 or B[1-9]3 (i.e. B13, B23 .... B93).

我尝试使用以下查询,但想实现 REGEXP 或 REGEXP_LIKE/INSTR 等。之前没有使用过它们,也无法理解。

Select *
FROM T
Where BNFT LIKE '%B3,%' or BNFT LIKE '%B3' 

请指教

Procedures will not work. Query must start with Select as 1st statement.

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

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

也就是说,有时我们会受制于其他人糟糕的设计决策。

在SQL服务器中,你会做:

where ',' + BNFT + ',' LIKE '%,33,%'

此问题最初被标记为 MySQL,为此目的提供 find_in_set()

Where find_in_set(33, BNFT) > 0
Select *
FROM T
Where ',' + BNFT + ',' LIKE '%,B3,%';

Select *
FROM T
Where CHARINDEX  (',B3,',',' + BNFT + ',') > 0;
This can be easily achieve by CTE, REGEXP/REGEXP_Like/INSTR works better with oracle, for MS SQL Server you can try this

声明@CSV VARCHAR(100) ='B2,B34,B31,B8,B4,B5,B33,B30,B20,B3'; SET @CSV = @CSV+',';

与 CTE 一样 ( SELECT SUBSTRING(@CSV,1,CHARINDEX(',',@CSV,1)-1) 作为 VAL, SUBSTRING(@CSV,CHARINDEX(',',@CSV,1)+1,LEN( @CSV)) 作为 REM 联合所有 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 WHERE LEN(A.REM)>=1 ) SELECT 来自 CTE 的 VAL 其中值='B3'