如何在sql中的where子句中实现条件语句

时间:2017-12-19 22:51:46

标签: sql sql-server ssms

我正在尝试编写一个查询,而我正试图弄清楚如何在sql中实现条件语句。基本上我希望我的查询从字符串列表中检查列的值,如果第一个存在只返回带有该字符串的值,如果不存在,则检查下一个字符串并重复该过程。我希望它在找到匹配后立即停止。 例如:

SELECT *
FROM Database
WHERE if colLetter = A // return all data with A value and don't bother checking for the next values. If A doesn't exist check for next value
else if colLetter = B // same instructions above
else if colLetter = C
...
...

我似乎无法理解如何实现这一点。

更新

我试过这个

SELECT (CASE 
    WHEN colLetter = 'A' AND colValue IS NOT NULL THEN colValue
    WHEN colLetter = 'B' AND colValue IS NOT NULL THEN colValue 
    WHEN colLetter = 'C' AND colValue IS NOT NULL THEN colValue
    ELSE NULL END)

我认为这样可行,但它仍会显示所有A,B,C甚至NULL的colValue

3 个答案:

答案 0 :(得分:0)

我想我知道你想要什么。这有点复杂,但这是一种方式:

select t.*
from (select t.*,
             dense_rank() over (order by (case when colLetter = 'A' then 1
                                               when colLetter = 'B' then 2
                                               when colLetter = 'C' then 3
                                                    . . .
                                          end)
                              ) as seqnum
      from t
     ) t
where seqnum = 1;

这将返回匹配的第一个字母。

实际上,你可以更简单地做到这一点:

select top (1) with ties t.*
from t
order by (case when colLetter = 'A' then 1
               when colLetter = 'B' then 2
               when colLetter = 'C' then 3
               . . .
          end);

答案 1 :(得分:0)

我可以为您提供帮助您实现目标的内容,但不是一行查询

可选 - 如果可能,基于collvalue的分区表可以提高您的需求的性能。

实际查询 -

声明@count int =(从中选择count(*) 从TABLE中选择top 1 *,其中collname ='A')t)

声明@sql nvarchar(max)=(选择合并(当@ count = 1时的情况) N'选择*来自TABLE,其中collname =''A'''END,'选择''没有A的值''))

EXEC sp_executesql @sql

@ count =(从中选择count(*) 从TABLE中选择top 1 *,其中collname ='B')t)

声明@sql nvarchar(max)=(选择合并(当@ count = 1时的情况) N'从表中选择*,其中collname =''B'''结束,'选择''没有B的值''))

EXEC sp_executesql @sql

希望这会有所帮助。

答案 2 :(得分:-1)

根据您的要求,您将需要带有in运算符的where子句和order by按顺序返回A,B,C匹配的记录

  dist
    - 4wyd98y98790.css
    - 948y59hslas8.js