首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

问一个关于查询的有关问题

2013-03-22 
问一个关于查询的问题数据库有N条数据,其中A字段的内容是记录1商品1|商品3|商品2记录2商品5|商品6|商品1|

问一个关于查询的问题
数据库有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)
*/


热点排行