0

ユーザーが別の単語でアカウントにタグを付けることができるツールがあります。アカウントの情報を追跡するのに役立ち、将来タグを簡単に検索できるようになります。

たとえば、テーブルに 10 個のアカウントがあり、すべてのアカウントに New、Payment、Yellow というキーワードがあるとします。

私の UI では、検索として複数のキーワードを入力し、それらの単語が見つかったすべてのアカウントを返す必要があります。

問題は、ストア プロシージャを使用して、検索する単語の文字列を次のように渡すことです。

@var = Yellow,New,Payment

私はあなたができるとは思わWHERE COL IN(@VAR)ないので、他にそれを行う方法がわかりません。

4

2 に答える 2

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 に答える
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 に答える