Sql server tsql从单个输入中搜索多行

Sql server tsql从单个输入中搜索多行,sql-server,tsql,Sql Server,Tsql,我的数据库有一个名为tags的列,它链接到一个帐号。例如,我可以有5个标签,蓝色、红色、绿色、黄色、粉色代表一个帐户,红色、蓝色、黑色代表另一个帐户 当我进行搜索时,我希望能够搜索多个标记,如蓝色、红色、白色,并让它返回任何带有这些标记的帐户 实现这一点的最佳方法是什么?在这里,您可以看到该技术,但您可以以不同的方式实现exmaple的表值函数,该函数将CSV转换为具有一列的表: /* Preparaing the test data */ DECLARE @DataSource TABLE (

我的数据库有一个名为tags的列,它链接到一个帐号。例如,我可以有5个标签,蓝色、红色、绿色、黄色、粉色代表一个帐户,红色、蓝色、黑色代表另一个帐户

当我进行搜索时,我希望能够搜索多个标记,如蓝色、红色、白色,并让它返回任何带有这些标记的帐户


实现这一点的最佳方法是什么?

在这里,您可以看到该技术,但您可以以不同的方式实现exmaple的表值函数,该函数将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] 

我想最好的方法是首先规范化数据库我所面临的困难是我需要传递一个逗号分隔的字符串,并在in子句中使用它,但我看不到用变量实现这一点的方法,除非它是动态SQL。你认为哪种in语句?传递我的关键字字符串并查看它们是否存在于列中。据我所知,在哪里IN@VAR行不通。因此,您需要检查列中的每个单词,通常它的外观为:类似于“%tag1%”的列或类似于“%tag2%”的列