也许是这样的:
测试数据
CREATE TABLE Table1
(
id INT,
value VARCHAR(200)
)
INSERT INTO Table1
VALUES
(1,'value1,value2,value3'),
(2,'value3,value4,value9'),
(3,'value4,value8,value9'),
(4,'value2,value3,value9')
拆分功能
CREATE FUNCTION dbo.Split (@sep char(1), @s varchar(512))
RETURNS table
AS
RETURN (
WITH Pieces(pn, start, stop) AS (
SELECT 1, 1, CHARINDEX(@sep, @s)
UNION ALL
SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
FROM Pieces
WHERE stop > 0
)
SELECT pn,
SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s
FROM Pieces
)
GO
查询
DECLARE @searchString VARCHAR(100)
SET @searchString='value1,value4,value8'
;WITH CTE
AS
(
SELECT
split.s as searchString
FROM
dbo.Split(',',@searchString) AS split
)
SELECT
*
FROM
Table1
WHERE EXISTS
(
SELECT
NULL
FROM
dbo.Split(',',Table1.value) AS split
WHERE EXISTS
(
SELECT
NULL
FROM
CTE
WHERE
CTE.searchString=split.s
)
)
结果
id value
1 value1,value2,value3
2 value3,value4,value9
3 value4,value8,value9
编辑
这种分裂函数以一个分离器和varchar
分裂。它是一个递归函数,用于缓存该输入的varchar
中的开始和结束位置。当计算开始和结束时,substring
是一项很容易执行的任务。
你知道数据不是第三范式吗?您是否考虑过先修复数据,然后TSQL语法更简单,并且查询执行更有效率? – Paparazzi 2012-04-03 14:15:43
基于你想要记录1,2和3,那么你的意思是包含value1,value4,或value8 – Paparazzi 2012-04-03 19:20:14
你是指一个表中包含所有的值和一个引用这些值的id的表? – 2012-04-04 06:21:07