Case Statement 麻烦的地方
Posted
技术标签:
【中文标题】Case Statement 麻烦的地方【英文标题】:Where Case Statement trouble 【发布时间】:2016-01-20 20:32:38 【问题描述】:我有一个 sql server 2008 表,比如说“alpha”,有三列。它们是 [ID]、[col1] 和 [col2]。
id|col1|col2
1 |X |john1X|
1 |Y |john1Y|
1 |Z |john1Z|
2 |X |john2|
3 |Y |john3|
4 |X |john4|
每个 ID 可能有多个条目。如果 col1 包含“X”,我希望显示该行。如果 col1 中没有带有“X”的 ID,我希望选择“Y”。否则该行根本不应该出现。
对于上述示例数据,预期输出将低于。
id|col1|col2
1 |X |john1X|
2 |X |john2|
3 |Y |john3|
4 |X |john4|
我一直在努力让这段代码工作,
select * from alpha
where col1 = case
when exists(select * from alpha where col1 = 'X') then 'X'
else 'Y'
end
但是无论我如何重写代码,我都会得到以下输出。
id|col1|col2
1 |X |john1X
2 |X |john2
4 |X |john4
【问题讨论】:
将 id 也传递给您的子查询 【参考方案1】:您可以使用row_number()
:
select a.*
from (select a.*,
row_number() over (partition by id
order by col1
) as seqnum
from alpha
where col1 in ('X', 'Y')
) a
where seqnum = 1;
注意:这个特定的逻辑按照指定的方式工作,因为 'X' case 语句进行更一般的排序或更多值。
【讨论】:
【参考方案2】:您的子查询中缺少一个子句...该行
when exists(select * from alpha where col1 = 'X') then 'X'
应该是
when exists(select * from alpha b where col1 = 'X' and b.id = alpha.id ) then 'X'
请注意,我在您的子查询中为表添加了别名,以便您可以将子查询表的 ID 字段与主表进行匹配。
【讨论】:
谢谢,这就是我的查询中缺少的内容!以上是关于Case Statement 麻烦的地方的主要内容,如果未能解决你的问题,请参考以下文章