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

问题描述 投票:0回答:3

我正在尝试编写一个查询,我正在试图弄清楚如何在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
...
...

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

UPDATE

我试过这样做

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

sql sql-server ssms
3个回答
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);

0
投票

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

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

实际查询 -

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

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

EXEC sp_executesql @sql

@count =(select count(*)from(select table 1 * from TABLE where collname ='B')t)

声明@sql nvarchar(max)=(选择合并(当@count = 1然后N'选择*来自TABLE,其中collname =''B'''END,'select''没有B'''的值))

EXEC sp_executesql @sql

希望这可以帮助 。


-1
投票

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

SELECT *
FROM Database
WHERE colLetter IN ('A', 'B', 'C')
ORDER BY colLetter
© www.soinside.com 2019 - 2024. All rights reserved.