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;