我有一个工具,允许用户使用不同的单词标记帐户。它有助于跟踪帐户信息,以便将来轻松搜索标签。
例如,表格中可能有10个帐户,所有帐户都有关键字“新建”,“付款”和“黄色”。
在我的用户界面上,我会输入多个关键字作为我的搜索,我需要它来返回找到这些字词的所有帐户。
问题是我正在使用存储过程并将字符串传递给搜索,例如
@var = Yellow,New,Payment
我认为你不能做WHERE COL IN(@VAR)
因此我不知道该怎么做。
答案 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]