繁体   English   中英

添加列的案例语句

[英]Case Statement to Add a Column

我有下表:

ID   Fruit
A    apple
A    banana
A    grapes
B    orange
B    apple
B    grapes
C    grapes
C    orange
C    banana

我想添加一个名为 Apple 的新列来表示 ID 是否与苹果相关联:

ID   Fruit    Apple
A    apple    yes
A    banana   yes
A    grapes   yes
B    orange   yes
B    apple    yes
B    grapes   yes
C    grapes   no
C    orange   no
C    banana   no

由于这似乎是一个人为的例子,我将发布几个选项。 最好的取决于你真正在做什么。

首先,这可能表现最好,但如果您可以为 JOINed 表提供多个匹配项,则存在重复行的风险。 这也是我提出的根据要求实际使用CASE表达式的唯一解决方案。

SELECT a.*, case when b.ID IS NOT NULL THEN 'Yes' ELSE 'No' END AS Apple
FROM MyTable a
LEFT JOIN MyTable b on b.ID = a.ID AND b.Fruit = 'Apple'

或者,这将永远不会重复行,但必须为每个结果行重新运行嵌套查询。 如果这不是一个人为的例子,而更像是家庭作业,这可能是预期的结果。

SELECT *, coalesce(
    (
       SELECT TOP 1 'Yes' 
       FROM MyTable b 
       WHERE b.ID = a.ID AND b.Fruit = 'Apple'
    ), 'No') As Apple
FROM MyTable a

最后,这还会为每个结果行重新运行嵌套查询,但未来的增强功能可能会对此进行改进,并且可以为来自同一个嵌套子查询的多个列提供值。

SELECT a.*, COALESCE(c.Apple, 'No') Apple
FROM MyTable a
OUTER APPLY (
    SELECT TOP 1 'Yes' As Apple
    FROM MyTable b
    WHERE b.ID = a.ID AND b.Fruit = 'Apple'
) c

看到他们在这里工作:

https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=e1991e8541e7421b90f601c7e8c8906b

它可以通过使用窗口化的COUNT_IF来实现,而无需 self JOIN :

SELECT *, COUNT_IF(Fruit = 'apple') OVER(PARTITION BY ID) > 0 AS Apple
FROM tab;

输出:

在此处输入图像描述

对于下表,

ID   Fruit
A    apple
A    banana
A    grapes
B    orange
B    apple
B    grapes
C    grapes
C    orange
C    banana

添加一个名为 Apple 的新列来表示 ID 是否与苹果相关联,结果集将是

ID   Fruit    Apple
A    apple    yes
A    banana   no
A    grapes   no
B    orange   no
B    apple    yes
B    grapes   no
C    grapes   no
C    orange   no
C    banana   no

如果预期的结果集如上所示,则以下查询将有助于获得所需的输出。

select
    id,
    case
        when fruit='apple' then 'yes'
        when fruit!='apple' then 'no'
    end as Apple
from Fruits;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM