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 麻烦的地方的主要内容,如果未能解决你的问题,请参考以下文章

如何检查Case When Statement中的重复值

Case Statement 总是给出 1. MySQL

在 mongodb 聚合框架中执行 case-statement

case语句

case

Select Case Statement 单行子查询返回多于一行