我正在将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
部分遇到了麻烦。我可以这样说:“当US表中的id
列不为空,而其他id
列(来自欧洲和南美)为空时,则记录为1。
类似地,如果Europe表中的id
列不为空,而US和South America表中的id
列为空,则记录2。
有更好的方法吗?
答案 0 :(得分:1)
针对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
答案 1 :(得分:0)
我认为您的数据结构非常糟糕。通常,将等效信息(例如地理信息)划分到不同的表中并不是一个好的数据模型。
我只会使用B(*)(A)
:
auto main() -> int
我还将表别名从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
是保留字。