我的数据库有一个名为标签的列,它链接到一个帐号。例如,我可以为一个帐户设置 5 个标签,蓝色、红色、绿色、黄色、粉红色,另一个帐户使用红色、蓝色、黑色。
当我进行搜索时,我希望能够搜索多个标签,例如蓝色、红色、白色,并让它返回带有任何这些标签的任何帐户。
实现这一目标的最佳方法是什么?
我的数据库有一个名为标签的列,它链接到一个帐号。例如,我可以为一个帐户设置 5 个标签,蓝色、红色、绿色、黄色、粉红色,另一个帐户使用红色、蓝色、黑色。
当我进行搜索时,我希望能够搜索多个标签,例如蓝色、红色、白色,并让它返回带有任何这些标签的任何帐户。
实现这一目标的最佳方法是什么?
在这里您可以看到该技术,但您可以以不同的方式实现(例如,具有将 CSV 转换为具有一列的表的表值函数):
/* 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]