簡體   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