0

我有一个工具,允许用户用不同的词标记帐户。它有助于跟踪帐户的信息,以便他们将来可以轻松地搜索标签。

例如,表中可能有 10 个帐户,它们都具有关键字 New、Payment 和 Yellow。

在我的 UI 上,我会输入多个关键字作为我的搜索,我需要它来返回找到这些字词的所有帐户。

问题是我正在使用存储过程并将字符串传递给搜索,例如

@var = Yellow,New,Payment

我不认为你可以这样做,WHERE COL IN(@VAR)所以我不知道该怎么做。

4

2 回答 2

0

前段时间我已经解决了这个问题,这就是我的做法,

Var 值将是

declare @Var varchar(50) = 'Yellow,New,Payment'

Select * from table A
where A.field in  (Select * from dbo.fnSplit(@Var, ',') as i)

这是我的函数拆分代码

alter FUNCTION [dbo].[fnSplit](
@sInputList VARCHAR(8000) -- List of delimited items
 , @sDelimiter VARCHAR(8000) = ',' -- delimiter that separates items
 ) RETURNS @List TABLE (item VARCHAR(8000))

BEGIN
 DECLARE @sItem VARCHAR(8000)
 WHILE CHARINDEX(@sDelimiter,@sInputList,0) <> 0
  BEGIN
    SELECT
     @sItem=RTRIM(LTRIM(SUBSTRING(@sInputList,1,CHARINDEX
      (@sDelimiter,@sInputList,0)-1))),  @sInputList=RTRIM(LTRIM(SUBSTRING(@sInputList,CHARINDEX
      (@sDelimiter,@sInputList,0)+LEN(@sDelimiter),LEN(@sInputList))))

  IF LEN(@sItem) > 0
    INSERT INTO @List SELECT @sItem
  END

 IF LEN(@sInputList) > 0
     INSERT INTO @List SELECT @sInputList -- Put the last item in
     RETURN
  END
于 2013-11-14T05:37:12.593 回答
0

假设您有以下表结构和数据:

DECLARE @DataSource TABLE
(
     [AccountID] TINYINT
    ,[KeyWord] NVARCHAR(24)
)

INSERT INTO @DataSource ([AccountID], [KeyWord])
VALUES (1,'Yellow')
      ,(1,'Red')
      ,(1,'Male')
      ,(2,'Old')
      ,(3,'Yellow')
      ,(3,'Old')
      ,(4,'New')
      ,(4,'Famale')

并且您正在使用上面的变量过滤记录:

DECLARE @SearchKeyWords NVARCHAR(MAX) = 'Yellow,Male,Red'

您唯一需要的是将 CSV 列表转换为表格:

DECLARE @XML XML = N'<r><![CDATA[' + REPLACE(@SearchKeyWords, ',', ']]></r><r><![CDATA[') + ']]></r>'

SELECT DISTINCT RTRIM(LTRIM(Tbl.Col.value('.', 'nvarchar(250)')))
FROM @xml.nodes('//r') Tbl(Col)

因此,这是完整的工作示例:

DECLARE @DataSource TABLE
(
     [AccountID] TINYINT
    ,[KeyWord] NVARCHAR(24)
)

INSERT INTO @DataSource ([AccountID], [KeyWord])
VALUES (1,'Yellow')
      ,(1,'Red')
      ,(1,'Male')
      ,(2,'Old')
      ,(3,'Yellow')
      ,(3,'Old')
      ,(4,'New')
      ,(4,'Famale')

DECLARE @SearchKeyWords NVARCHAR(MAX) = 'Yellow,Male,Red'

DECLARE @XML XML = N'<r><![CDATA[' + REPLACE(@SearchKeyWords, ',', ']]></r><r><![CDATA[') + ']]></r>'


;WITH KeyWords([KeyWord]) AS
(
    SELECT DISTINCT RTRIM(LTRIM(Tbl.Col.value('.', 'nvarchar(250)')))
    FROM @xml.nodes('//r') Tbl(Col)
)
SELECT DISTINCT [AccountID]
FROM @DataSource DS
INNER JOIN KeyWords KS
    ON DS.[KeyWord] = KS.[KeyWord]
于 2013-11-14T07:36:50.223 回答