CASE WHEN 有多个条件
CASE WHEN with Multiple conditions
我正在尝试使用 MySQL Workbench 中的以下条件创建新列。
我试着写了一段代码来获取新的列(输出),它应该是这样的:
如果亚洲人是 Yes 则亚洲人
如果黑色是 Yes 则黑色
如果黑色为是且其他为是则黑色
如果白色是 Yes 那么白色
如果西班牙裔是 Yes 那么西班牙裔
如果西班牙裔为是且其他为是则西班牙裔
如果 Pacific 是 Yes 那么 Pacific
IF Middle 是 Yes Then Middle
如果“其他”是“是”,则“其他”
IF 不止一个报告然后多个(预计黑人和其他人是,西班牙裔和其他人是)
ELSE 未报告
CREATE TABLE Test(
ID INT NOT NULL,
Asian CHAR(7),
Black CHAR(9),
White CHAR(6),
Hispanic CHAR(5),
Pacific CHAR(7),
Middle CHAR(9),
Other CHAR(6)
);
insert into Test values
(1,'Yes','No','No','No', 'No','No','No'),
(2,'No','Yes','No','No', 'No','No','No'),
(3,'No','No','Yes','No', 'No','No','No'),
(4,'No','No','No','Yes', 'No','No','No'),
(5,'No','No','No','No', 'Yes','No','No'),
(6,'No','No','No','No', 'No','Yes','No'),
(7,'No','No','No','No', 'No','No','Yes'),
(8,'No','No','No','No', 'Yes','No','Yes'),
(9,'No','Yes','No','No', 'No','No','Yes'),
(10,'Yes','Yes','Yes','No', 'No','No','Yes'),
(11,'No','No','Yes','Yes', 'No','No','Yes'),
(12,'No','No','No','Yes', 'No','No','Yes'),
(13,'No','Yes','No','No', 'No','No','Yes')
;
Select ID, Asian, Black, White, Hispanic, Pacific, Middle, Other,
case
when Asian='Yes' then
case
when Black='No' then 'Asian'
when White='No' then 'Asian'
when Hispanic='No' then 'Asian'
when Pacific='No' then 'Asian'
when Middle='No' then 'Asian'
when Other='No' then 'Asian'
end
When Black='Yes' then
case
when Asian='No' then 'Black'
when White='No' then 'Black'
when Hispanic='No' then 'Black'
when Pacific='No' then 'Black'
when Middle='No' then 'Black'
when Other='Yes' then 'Black'
end
When White='Yes' then
case
when Asian='No' then 'White'
when Black='No' then 'White'
when Hispanic='No' then 'White'
when Pacific='No' then 'White'
when Middle='No' then 'White'
when Other='No' then 'White'
end
When Hispanic='Yes' then
case
when Asian='No' then 'Hispanic'
when Black='No' then 'Hispanic'
when White='No' then 'Hispanic'
when Pacific='No' then 'Hispanic'
when Middle='No' then 'Hispanic'
when Other='Yes' then 'Hispanic'
end
When Pacific='Yes' then
case
when Asian='No' then 'Pacific'
when Black='No' then 'Pacific'
when White='No' then 'Pacific'
when Hispanic='No' then 'Pacific'
when Middle='No' then 'Pacific'
when Other='No' then 'Pacific'
end
When Middle='Yes' then
case
when Asian='No' then 'Middle'
when Black='No' then 'Middle'
when White='No' then 'Middle'
when Hispanic='No' then 'Middle'
when Pacific='No' then 'Middle'
when Other='No' then 'Middle'
end
When Other='Yes' then
case
when Asian='No' then 'Other'
when Black='No' then 'Other'
when White='No' then 'Other'
when Hispanic='No' then 'Other'
when Pacific='No' then 'Other'
when Middle='No' then 'Other'
end
else 'Multiple'
end AS Race
FROM Test;
我没有得到 'Multiple'。非常感谢您的帮助和意见。谢谢。
问题是在您的描述中您使用了一些 AND
,但在您的查询中您没有使用。例如。你说:
IF Black is Yes AND Other is Yes Then Black
但是查询中没有对应case when Black = 'Yes' and Other = 'No' then
第二个问题是您在描述中没有使用足够的 AND
。例如:
IF Asian is Yes Then Asian
没有。如果 Asian 是 Yes Then Either Asian or Multiple。所以你真正想说的是:
If Asian is Yes AND White is No AND Black is No AND Hispanic is No AND Pacific is No AND Middle is No AND Other is No Then Asian
如果您在描述任务时准确无误,通常很容易将其翻译成 SQL。在您的示例中,我们几乎可以逐字逐句地使用准确的描述。这就是您的查询当时的样子:
Select
ID, Asian, Black, White, Hispanic, Pacific, Middle, Other,
case
when Asian = 'Yes'
and White = 'No'
and Black = 'No'
and Hispanic = 'No'
and Pacific = 'No'
and Middle = 'No'
and Other = 'No'
then 'Asian'
when Asian = 'No'
and White = 'No'
and Black = 'Yes'
and Hispanic = 'No'
and Pacific = 'No'
and Middle = 'No'
then 'Black'
...
不过,如果使用其他数据模型,这会更短。假设您的 table 是关于人的,即 ID 是一个人的 ID。然后你会有一个 table person
包含一行每个人的名字等等,一个 table attribute
包含每个属性一行('Asian', 'White', 等等)和一个 table 将一个人与他们的属性联系起来:person_attribute (person_id, attribute_id)
.
然后您可以这样查询 table:
select
pa.person_id,
case
when count(*) = 1 and max(a.attribute = 'Asian') then 'Asian'
when count(*) = 1 and max(a.attribute = 'Black') then 'Black'
when count(*) = 2 and min(a.attribute = 'Black') and max(a.attribute = 'Other') then 'Black'
...
else 'Multiple'
end as race
from person_attribute pa
join attribute a on a.attributeid = pa.attribute_id
group by pa.person_id;
我正在尝试使用 MySQL Workbench 中的以下条件创建新列。
我试着写了一段代码来获取新的列(输出),它应该是这样的: 如果亚洲人是 Yes 则亚洲人 如果黑色是 Yes 则黑色 如果黑色为是且其他为是则黑色 如果白色是 Yes 那么白色 如果西班牙裔是 Yes 那么西班牙裔 如果西班牙裔为是且其他为是则西班牙裔 如果 Pacific 是 Yes 那么 Pacific IF Middle 是 Yes Then Middle 如果“其他”是“是”,则“其他” IF 不止一个报告然后多个(预计黑人和其他人是,西班牙裔和其他人是) ELSE 未报告
CREATE TABLE Test(
ID INT NOT NULL,
Asian CHAR(7),
Black CHAR(9),
White CHAR(6),
Hispanic CHAR(5),
Pacific CHAR(7),
Middle CHAR(9),
Other CHAR(6)
);
insert into Test values
(1,'Yes','No','No','No', 'No','No','No'),
(2,'No','Yes','No','No', 'No','No','No'),
(3,'No','No','Yes','No', 'No','No','No'),
(4,'No','No','No','Yes', 'No','No','No'),
(5,'No','No','No','No', 'Yes','No','No'),
(6,'No','No','No','No', 'No','Yes','No'),
(7,'No','No','No','No', 'No','No','Yes'),
(8,'No','No','No','No', 'Yes','No','Yes'),
(9,'No','Yes','No','No', 'No','No','Yes'),
(10,'Yes','Yes','Yes','No', 'No','No','Yes'),
(11,'No','No','Yes','Yes', 'No','No','Yes'),
(12,'No','No','No','Yes', 'No','No','Yes'),
(13,'No','Yes','No','No', 'No','No','Yes')
;
Select ID, Asian, Black, White, Hispanic, Pacific, Middle, Other,
case
when Asian='Yes' then
case
when Black='No' then 'Asian'
when White='No' then 'Asian'
when Hispanic='No' then 'Asian'
when Pacific='No' then 'Asian'
when Middle='No' then 'Asian'
when Other='No' then 'Asian'
end
When Black='Yes' then
case
when Asian='No' then 'Black'
when White='No' then 'Black'
when Hispanic='No' then 'Black'
when Pacific='No' then 'Black'
when Middle='No' then 'Black'
when Other='Yes' then 'Black'
end
When White='Yes' then
case
when Asian='No' then 'White'
when Black='No' then 'White'
when Hispanic='No' then 'White'
when Pacific='No' then 'White'
when Middle='No' then 'White'
when Other='No' then 'White'
end
When Hispanic='Yes' then
case
when Asian='No' then 'Hispanic'
when Black='No' then 'Hispanic'
when White='No' then 'Hispanic'
when Pacific='No' then 'Hispanic'
when Middle='No' then 'Hispanic'
when Other='Yes' then 'Hispanic'
end
When Pacific='Yes' then
case
when Asian='No' then 'Pacific'
when Black='No' then 'Pacific'
when White='No' then 'Pacific'
when Hispanic='No' then 'Pacific'
when Middle='No' then 'Pacific'
when Other='No' then 'Pacific'
end
When Middle='Yes' then
case
when Asian='No' then 'Middle'
when Black='No' then 'Middle'
when White='No' then 'Middle'
when Hispanic='No' then 'Middle'
when Pacific='No' then 'Middle'
when Other='No' then 'Middle'
end
When Other='Yes' then
case
when Asian='No' then 'Other'
when Black='No' then 'Other'
when White='No' then 'Other'
when Hispanic='No' then 'Other'
when Pacific='No' then 'Other'
when Middle='No' then 'Other'
end
else 'Multiple'
end AS Race
FROM Test;
我没有得到 'Multiple'。非常感谢您的帮助和意见。谢谢。
问题是在您的描述中您使用了一些 AND
,但在您的查询中您没有使用。例如。你说:
IF Black is Yes AND Other is Yes Then Black
但是查询中没有对应case when Black = 'Yes' and Other = 'No' then
第二个问题是您在描述中没有使用足够的 AND
。例如:
IF Asian is Yes Then Asian
没有。如果 Asian 是 Yes Then Either Asian or Multiple。所以你真正想说的是:
If Asian is Yes AND White is No AND Black is No AND Hispanic is No AND Pacific is No AND Middle is No AND Other is No Then Asian
如果您在描述任务时准确无误,通常很容易将其翻译成 SQL。在您的示例中,我们几乎可以逐字逐句地使用准确的描述。这就是您的查询当时的样子:
Select
ID, Asian, Black, White, Hispanic, Pacific, Middle, Other,
case
when Asian = 'Yes'
and White = 'No'
and Black = 'No'
and Hispanic = 'No'
and Pacific = 'No'
and Middle = 'No'
and Other = 'No'
then 'Asian'
when Asian = 'No'
and White = 'No'
and Black = 'Yes'
and Hispanic = 'No'
and Pacific = 'No'
and Middle = 'No'
then 'Black'
...
不过,如果使用其他数据模型,这会更短。假设您的 table 是关于人的,即 ID 是一个人的 ID。然后你会有一个 table person
包含一行每个人的名字等等,一个 table attribute
包含每个属性一行('Asian', 'White', 等等)和一个 table 将一个人与他们的属性联系起来:person_attribute (person_id, attribute_id)
.
然后您可以这样查询 table:
select
pa.person_id,
case
when count(*) = 1 and max(a.attribute = 'Asian') then 'Asian'
when count(*) = 1 and max(a.attribute = 'Black') then 'Black'
when count(*) = 2 and min(a.attribute = 'Black') and max(a.attribute = 'Other') then 'Black'
...
else 'Multiple'
end as race
from person_attribute pa
join attribute a on a.attributeid = pa.attribute_id
group by pa.person_id;