如何在String中选择多模式?

时间:2017-07-14 02:19:12

标签: sql

例: 数据库表1:

   | ColA |ColB|
   | 1    |A1,A2,A3,A4,A5|
   | 2    |B1,B2|

参数输入:A4,A1,A2,A5

我想选择第1行,因为ColB包含参数输入的所有值。

怎么办?

1 个答案:

答案 0 :(得分:2)

首先,正如@Gordon Linoff所说,您需要将数据更改为SQLish,即不要将数据分开,而是将它们分成新行。这可以通过以下方式实现:

注意我已经使用过MS SQL其他版本的SQL会有不同的答案,但方法应该保持不变。

样本表

CREATE TABLE YourData (ColA int, ColB varchar(max))
INSERT INTO YourData VALUES (1,'A1,A2,A3,A4,A5')
INSERT INTO YourData VALUES (2,'B1,B2')

查询(递归公用表表达式)

;WITH CTE (ColA, ColB_new, ColB)
AS 
(
SELECT 
ColA
,LEFT(ColB,CHARINDEX(',',ColB+',')-1)
,STUFF(ColB,1,CHARINDEX(',',ColB+','),'')
FROM YourData
UNION ALL
SELECT 
ColA
,LEFT(ColB,CHARINDEX(',',ColB+',')-1)
,STUFF(ColB,1,CHARINDEX(',',ColB+','),'')
FROM CTE
WHERE ColB >''
)
SELECT 
ColA, ColB_new
FROM CTE
ORDER BY ColA

所以你要离开这个:

   | ColA |ColB|
   | 1    |A1,A2,A3,A4,A5|
   | 2    |B1,B2|

对此:

ColA    ColB_new
1           A2
1           A3
1           A4
1           A5
1           A1
2           B1
2           B2

然后你添加一个简单的WHERE条款,例如WHERE ColB_new IN('A4','A1','A2','A5')

如果您想获取有关第一个表(YourData)中的信息的信息:

   | ColA |ColB|
   | 1    |A1,A2,A3,A4,A5|

然后你可以在ColA上的两个表上做JOIN