检查值范围内的逗号分隔列值 - SQL Server

时间:2015-12-31 12:11:05

标签: sql sql-server

我有一张如下表格

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
上面的查询

排除搜索数据在一起的行。

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

FIDDLE

答案 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)