搜索表以根据输入变量查找多个记录

时间:2013-11-14 00:41:53

标签: sql-server tsql csv

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

例如,表格中可能有10个帐户,所有帐户都有关键字“新建”,“付款”和“黄色”。

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

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

@var = Yellow,New,Payment

我认为你不能做WHERE COL IN(@VAR)因此我不知道该怎么做。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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]