代码之家  ›  专栏  ›  技术社区  ›  anon_swe

SQL:多个左联接后的大小写

  •  0
  • anon_swe  · 技术社区  · 6 年前

    我在使用MySQL和一个名为 students . 我正试图添加一个列,指出一个学生是来自美国、欧洲、南美,还是一个都不是。具体来说,如果没有一个是真的,我想在列中加0,如果是美国,我想加1,如果是欧洲,我想加2,如果是南美,我想加3。

    所以我在做这样的事情:

    SELECT name,
    CASE WHEN ... 
    FROM original_table or
    LEFT JOIN us_table us
    ON or.student_id = us.student_id
    LEFT JOIN europe_table eur
    ON or.student_id = eur.student_id
    LEFT JOIN south_america_table sa
    ON or.student_id = sa.student_id
    

    我有麻烦 CASE WHEN 部分。我可以说“当 id US表中的列不为空,另一列不为空。 身份证件 列(来自欧洲和南美)为空,记录为1。

    同样,如果 身份证件 欧洲表中的列不为空,美国和南美表中的列不为空 身份证件 列为空,记录为2。

    有更好的方法吗?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Barmar    6 年前

    测试每个 NULL 似乎是最好的办法。使用 ELSE 对于 0 价值。

    CASE WHEN us.student_id IS NOT NULL THEN 1
         WHEN eur.student_id IS NOT NULL THEN 2
         WHEN sa.student_id IS NOT NULL THEN 3
         ELSE 0
    END 
    
        2
  •  0
  •   Gordon Linoff    6 年前

    我认为你的数据结构非常糟糕。通常,将等效信息(如地理位置)拆分为不同的表不是一个好的数据模型。

    我只会用 exists :

    SELECT name,
           (CASE WHEN EXISTS (SELECT 1 FROM us_table us WHERE ot.student_id = us.student_id)
                 THEN 1
                 WHEN EXISTS (SELECT 1 FROM europe_table eur WHERE ot.student_id = eur.student_id)
                 THEN 2
                 WHEN EXISTS (SELECT 1 FROM south_america_table sa WHERE ot.student_id = sa.student_id)
                 THEN 3
                 ELSE 0
            END) as origin
    FROM original_table ot;
    

    我还将表别名更改为 ot or ,因为 是保留字。