【问题标题】:CASE WHEN with Multiple conditionsCASE WHEN 有多个条件
【发布时间】:2021-11-04 20:41:05
【问题描述】:

我正在尝试在 MySQL Workbench 中使用以下条件创建新列。

我尝试编写代码来获取新列(输出),它应该是这样的: 如果亚洲人是,那么亚洲人 如果黑色为是,则为黑色 如果黑色为是,其他为是,则为黑色 如果白色为是,则为白色 如果西班牙裔是肯定的,那么西班牙裔 如果西班牙裔是“是”并且其他人是“是”那么西班牙裔 如果太平洋是肯定的,那么太平洋 IF Middle 是 Yes Then Middle 如果其他为是,则其他 如果报告了一个以上然后多个(期望黑人和其他人是肯定的,西班牙裔和其他人是肯定的) 否则不报告

  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;

我没有得到“多个”。您的帮助和意见将不胜感激。谢谢。

【问题讨论】:

  • 外部CASE 语句的结构方式,如果有亚洲='No',White='No',Black='No' 的记录,你只会得到'Multiple'等。对于您显示的所有测试记录,至少有一个“是”,这意味着将评估内部CASE 语句之一。
  • 问题在于你的桌子设计。
  • kosmer 清楚地描述了这个问题。使用case when Asian='Yes' then ... When Black='Yes' then ... When White='Yes' then ... else 'Multiple',对于所有值都不是“是”的行,您将获得“多个”,并且显示的表中没有这样的行。因此,我不考虑表格设计 the 问题,但是当您想要检测某些组合时,使用此表格会变得相当笨拙,最好有一个每行一行的表格而是 ID 和属性,因此您可以简单地聚合。
  • 如果是我,我会有两列 ID, EthnicityPRIMARY KEY(ID, Ethnicity)

标签: mysql sql mysql-workbench


【解决方案1】:

问题是在您的描述中您使用了一些AND,但在您的查询中却没有。例如。你说:

如果黑色为是,其他为是,则为黑色

但查询中没有根据case when Black = 'Yes' and Other = 'No' then

第二个问题是您在描述中没有使用足够的AND。例如:

如果亚洲人是肯定的,那么亚洲人

没有。如果 Asian 是 Yes 然后是 Asian 或 Multiple。所以你真正想说的是:

如果亚洲人是,白人是不是,黑人是不是,西班牙人是不是,太平洋是不是,中部是不是,其他人是不是,那么亚洲人

如果您在描述任务时准确,通常很容易将其转换为 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'
    ...

不过,如果使用另一个数据模型,这会更短。假设您的表是关于人员的,即 ID 是人员 ID。然后,您将有一个表 person 包含每个人一行及其姓名等,一个表 attribute 包含每个属性一行(“亚洲人”、“白人”等)和一个与人相关的表他们的属性:person_attribute (person_id, attribute_id)

然后您可以这样查询表:

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;

【讨论】:

  • 谢谢托尔斯滕。
猜你喜欢
  • 2021-08-04
  • 2022-08-17
  • 2019-02-01
  • 2017-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-16
  • 1970-01-01
相关资源
最近更新 更多