用逗号搜索字符串中的特定值
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'
我的 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'