私のデータベースには、アカウント番号にリンクされたタグという列があります。たとえば、あるアカウントには青、赤、緑、黄、ピンク、別のアカウントには赤、青、黒の 5 つのタグを付けることができます。
検索を行うとき、青、赤、白などの複数のタグを検索して、それらのタグのいずれかが含まれるアカウントを返すようにしたいと考えています。
これを達成するための最良の方法は何ですか?
私のデータベースには、アカウント番号にリンクされたタグという列があります。たとえば、あるアカウントには青、赤、緑、黄、ピンク、別のアカウントには赤、青、黒の 5 つのタグを付けることができます。
検索を行うとき、青、赤、白などの複数のタグを検索して、それらのタグのいずれかが含まれるアカウントを返すようにしたいと考えています。
これを達成するための最良の方法は何ですか?
ここでテクニックを見ることができますが、別の方法で実装することもできます (たとえば、CSV を 1 つの列を持つテーブルに変換するテーブル値関数を使用する場合)。
/* Preparaing the test data */
DECLARE @DataSource TABLE
(
[UserID] INT
,[Tag] VARCHAR(12)
)
INSERT INTO @DataSource ([UserID], [Tag])
VALUES (1, 'red')
,(1, 'blue')
,(2, 'red')
,(2, 'black')
,(2, 'green')
,(3, 'black')
,(3, 'green')
,(4, 'yellow')
,(5, 'red')
,(6, 'black')
/* Setting filter value*/
DECLARE @FiltersValuesInCSV VARCHAR(MAX) = 'red,black'
/* Solution */
DECLARE @XML xml = N'<r><![CDATA[' + REPLACE(@FiltersValuesInCSV, ',', ']]></r><r><![CDATA[') + ']]></r>'
;WITH Colors([Color]) AS
(
SELECT DISTINCT RTRIM(LTRIM(Tbl.Col.value('.', 'nvarchar(250)')))
FROM @xml.nodes('//r') Tbl(Col)
)
SELECT DISTINCT [UserID]
FROM @DataSource DS
INNER JOIN Colors C
ON DS.[Tag] = C.[Color]