我正在尝试编写一个查询,我正在试图弄清楚如何在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
我想我明白了你的意思。这有点复杂,但这是一种方式:
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);
我可以为您提供帮助您实现目标的内容,但不是一行查询
可选 - 如果可能,基于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
希望这可以帮助 。
根据您的要求,您将需要带有in运算符的where子句和order by按顺序返回A,B,C匹配的记录
SELECT *
FROM Database
WHERE colLetter IN ('A', 'B', 'C')
ORDER BY colLetter