我有一张如下表格
Id Col
---- ------
1 a
2 b
3 a,b
4 b,c
5 b,a
6 c
7 ab
我正在寻找用户从前端选择值'a'或'b'或两者(它可以是任何数量的值,如'a','b')的sql。
Declare @searchval varchar(max)
SET @Searchvalue = 'a'
Select id from tbl where col in (@Searchvalue ) should return 1,3,5
SET @Searchvalue = 'a,b'
select id from tbl where col in (@Searchvalue ) should return 1,2,3,4,5
上面的查询排除搜索数据在一起的行。
答案 0 :(得分:3)
显然,正确的做法是为您的列表提供适当的数据结构。 SQL为列表提供了很好的数据类型:它被称为表,而不是字符串。
有时,你会被其他人的错误决定所困扰。构建所需查询的最简单方法可能是:
where ',' + col + ',' like '%,a,%' or
',' + col + ',' like '%,b,%'
如果这些值实际上是单个字母,那么这可以简化 - 事实上,在这种情况下,逗号并不真正起作用。你可以这样做:
where col like '%[ab]%'
答案 1 :(得分:0)
这样的事情:
where col = 'a'
or col like 'a,%'
or col like '%,a,%'
or col like '%,a'
or col = 'b'
or col like 'b,%'
or col like '%,b,%'
or col like '%,b'
答案 2 :(得分:0)
它很冗长,但你可以用charindex替换
SELECT t.id FROM t
JOIN t tt ON CHARINDEX(',a,',CONCAT(',',t.col,','))>0
GROUP BY t.id
和第二个查询
SELECT t.id FROM t
JOIN t tt ON CHARINDEX(',a,',CONCAT(',',t.col,','))>0
OR CHARINDEX(',b,',CONCAT(',',t.col,','))>0
GROUP BY t.id
答案 3 :(得分:0)
您必须将搜索字符串拆分为单独的部分,然后在查询中使用它... 试试这个
$new = 1;
$sum = 0;
$last_fahrer = 'initial';
while($row = mysqli_fetch_array($sql, MYSQLI_ASSOC)) {
if($last_fahrer != $row['fahrer'] && $last_fahrer != 'initial') {
echo "<tr>"
. '<td colspan="3">Summ</td>'
. "<td>" . $sum . "</td>"
. "</tr>";
$sum = 0;
$new = 1;
}
if($new == 1) {
echo "<tr>"
. '<td colspan="4">' . ucwords($row["fahrer"])
. '</td>'
. '</tr>';
$new = 0;
}
echo "<tr>"
. "<td>" . $row['id'] ."</td>"
. "<td>" . $row['abholdatum'] ."</td>"
. "<td>" . $row['fahrer'] . "</td>"
. "<td>" . $row['preis'] . "</td>"
. "</tr>";
$last_fahrer = $row['fahrer'];
$sum = $sum + $row['preis'];
}
echo "<tr>"
. '<td colspan="3">Summ</td>'
. "<td>" . $sum . "</td>"
. "</tr>"
. "</table>"
. "</div>";
答案 4 :(得分:-1)
每个人都感谢您的贡献。我也承认数据库设计不合适。我通过将列值填充到表变量并在查询中使用它来解决了这个问题
DECLARE @Prog TABLE
(
UserID INT,
Program VARCHAR(8000)
)
INSERT @Prog
SELECT UserID,
LTRIM(RTRIM(m.n.value('.[1]','varchar(8000)'))) AS Program
FROM
(
SELECT ID,CAST('<XMLRoot><RowData>' + REPLACE(col,',','</RowData><RowData>') + '</RowData></XMLRoot>' AS XML) AS x
FROM tbl
)t
CROSS APPLY x.nodes('/XMLRoot/RowData')m(n)
Select * from @Prog where Program in (@SearchValue)