在分隔的字符串列中搜索

时间:2012-04-03 11:37:58

标签: sql-server sql-server-2008 tsql split

我有一个像这样的搜索字符串:'value1,value4,value8'

我有一个数据库表,其条目如下:

id   |    value
-----+------------------------
1    |    value1,value2,value3
2    |    value3,value4,value9
3    |    value4,value8,value9
4    |    value2,value3,value9

现在我正在寻找一种方法来搜索数据库中包含value1,value4或value8的所有记录。

在这个例子中,当我选择时,我想要记录1,2和3。

我已经有了一个split函数,它将我的搜索字符串拆分为IN VALUES,如下所示:'value1','value4','value8',但我无法让它工作以选择正确的记录。

感谢。

3 个答案:

答案 0 :(得分:2)

也许是这样的:

测试数据

CREATE TABLE Table1
(
    id INT,
    value VARCHAR(200)
)
INSERT INTO Table1
VALUES
    (1,'value1,value2,value3'),
    (2,'value3,value4,value9'),
    (3,'value4,value8,value9'),
    (4,'value2,value3,value9')

拆分功能

CREATE FUNCTION dbo.Split (@sep char(1), @s varchar(512))
RETURNS table
AS
RETURN (
    WITH Pieces(pn, start, stop) AS (
      SELECT 1, 1, CHARINDEX(@sep, @s)
      UNION ALL
      SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
      FROM Pieces
      WHERE stop > 0
    )
    SELECT pn,
      SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s
    FROM Pieces
  )
GO

<强>查询

DECLARE @searchString VARCHAR(100)
SET @searchString='value1,value4,value8'
;WITH CTE
AS
(
    SELECT 
        split.s as searchString
    FROM 
        dbo.Split(',',@searchString) AS split
)
SELECT
    *
FROM
    Table1
WHERE EXISTS
(
    SELECT
        NULL
    FROM
        dbo.Split(',',Table1.value) AS split
    WHERE EXISTS
    (
        SELECT
            NULL
        FROM
            CTE
        WHERE
            CTE.searchString=split.s
    )
)

<强>结果

id      value
1       value1,value2,value3
2       value3,value4,value9
3       value4,value8,value9

修改

此拆分功能接受分隔符并varchar进行拆分。它是一个递归函数,用于计算sperator在输入varchar中的开始和结束位置。计算开始和结束时,substring是一项很容易执行的任务。

答案 1 :(得分:0)

如果你在代码中有匹配的值,它将是静态的,这可能会起作用:

select * from table where value like '%value1%' and value like '%value4%' and value like '%value8%'

如果您希望它包含所有值。如果你想要它包含,或者你切换'和'为'或'

编辑:

在代码中使用值可以在代码中动态构建SQL语句。

string statement = "select * from table where value like '%value%'";
foreach (string value in collectionOfValues) {
      statement += " and value like '" + value + "'";
}

我当然会使用SqlParameters而不是直接将值放在语句中,但是你抓住了我的漂移。

答案 2 :(得分:0)

要获得您所要求的内容,我认为您需要将分离的结果(不带单引号)插入临时表中,或者使分割函数返回表格。然后你可以说:

SELECT column1, column2, column3 
FROM table1
WHERE value in (select * from #values)

OR

WHERE value in (select * from dbo.StringSplitFunc(...))

取决于你采取的方法。