问一个关于查询的问题
数据库有N条数据,其中A字段的内容是
记录1 商品1|商品3|商品2
记录2 商品5|商品6|商品1|商品8
.......
记录N 商品1|商品7
现在得到字符串“商品3|商品2|商品1”
如何把对应记录1查询出来 ?
[解决办法]
通过一个表值函数来实现吧
代码如下
--相关函数
CREATE FUNCTION [dbo].[fn_SplitStr]
(
@String NVARCHAR(4000), --待分隔的字符串
@Separator NVARCHAR(4) --分隔符号
)
RETURNS @strTable TABLE (strVal NVARCHAR(4000)) --返回字符串列表
AS
BEGIN
DECLARE
@Occurrences INT,
@Counter INT,
@tmpStr NVARCHAR(4000)
SET @Counter = 0
IF SUBSTRING(@String,LEN(@String),1) <> @Separator
SET @String = @String + @Separator
SET @Occurrences = (DATALENGTH(REPLACE(@String,@Separator,@Separator+'#')) - DATALENGTH(@String))/ DATALENGTH(@Separator)
SET @tmpStr = @String
WHILE @Counter <= @Occurrences
BEGIN
SET @Counter = @Counter + 1
IF(LEN(SUBSTRING(@tmpStr,1,CHARINDEX(@Separator,@tmpStr)-1)) > 0)
INSERT INTO @strTable VALUES(SUBSTRING(@tmpStr,1,CHARINDEX(@Separator,@tmpStr)-1))
SET @tmpStr = SUBSTRING(@tmpStr,CHARINDEX(@Separator,@tmpStr)+1,4000)
IF DATALENGTH(@tmpStr) = 0
BREAK
END
RETURN
END
go
--测试数据
DECLARE @tb TABLE (id NVARCHAR(20) ,A NVARCHAR(100))
INSERT INTO @tb
( id,A )
SELECT '记录1','商品1
[解决办法]
商品3
[解决办法]
商品2' UNION all
SELECT '记录2','商品5
[解决办法]
商品6
[解决办法]
商品1
[解决办法]
商品8' UNION all
SELECT '记录N','商品1
[解决办法]
商品7'
DECLARE @str NVARCHAR(100)
SET @str=N'商品3
[解决办法]
商品2
[解决办法]
商品1'
SELECT c.id FROM
(
SELECT * FROM
(
SELECT * FROM @tb a CROSS APPLY fn_SplitStr(a.A,N'
[解决办法]
')
) t
WHERE EXISTS
(
SELECT * FROM fn_SplitStr(@str,N'
[解决办法]
') b WHERE t.strVal=b.strVal
)
) c
GROUP BY c.id
HAVING COUNT(c.id)=(SELECT COUNT(*) FROM fn_SplitStr(@str,N'
[解决办法]
'))
/*
id
--------------------
记录1
(1 row(s) affected)
*/