我有一个像这样的搜索字符串:'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',但我无法让它工作以选择正确的记录。
感谢。
答案 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(...))
取决于你采取的方法。