[英]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.