我有一个表“动物”,其中列出了几个动物,每个动物都有一个animal_id、一个区域设置,以及一个与区域设置相对应的名称,名称可以为null。这张桌子看起来像:
--------------------------------------------
id | animal_id | locale | name
--------------------------------------------
"4" | "10-3-5" | "en_US" | "dog"
"5" | "10-3-5" | "de_DE" | "hund"
"8" | "10-3-7" | "en_US" | "fox"
"9" | "10-3-7" | "de_DE" | NULL我希望有一个特定区域设置的所有名称,但是有些动物从来没有为特定的区域设置命名(正如上面fox的名称对于locale =de_DE是空的),所以下面的sql:
SELECT
animal.animal_id,
animal.name
FROM animal
WHERE animal.locale = "de_DE";给出
------------------------
animal_id | name
------------------------
"10-3-5" | "hund"
"10-3-7" | NULL如果某个特定区域设置的名称为null,则我希望检索en_US区域设置的名称,我想要的结果是:
------------------------
animal_id | name
------------------------
"10-3-5" | "hund"
"10-3-7" | "fox"我尝试了以下查询:
SELECT
animal.animal_id,
IFNULL(animal.name, (SELECT animal.name FROM animal WHERE animal.locale="en_US"))
FROM animal
WHERE animal.locale = "de_DE";但结果是不正确的,我其实也不明白:
------------------------
animal_id | IFNULL(animal.name, (SELECT animal.name FROM animal WHERE animal.locale="en_US"))
------------------------
"10-3-5" | "hund"
"10-3-7" | "dog" <-- animal_id = 10-3-7 does not corresponds to "dog"我也试过:
SELECT
animal.animal_id,
animal.name
FROM animal WHERE ((animal.locale = "de_DE" AND animal.name != NULL)
OR animal.locale = "en_US");然后只返回与en_US相等的地区名称:
------------------------
animal_id | name
------------------------
"10-3-5" | "dog"
"10-3-7" | "fox"我该怎么做?
提前感谢!
发布于 2016-07-08 13:52:26
你走在正确的轨道上:
SELECT
animal.animal_id,
IFNULL(animal.name, (SELECT b.name FROM animal b WHERE b.locale="en_US" and animal.animal_id = b.animal_id))
FROM animal
WHERE animal.locale = "de_DE";您没有对IFNULL选择中的动物id进行过滤。基本上,IFNULL(.,.)检查一个值是否为null,然后将在其位置运行另一个查询。从文件中:
ifnull()函数返回其第一个非空参数的副本,如果两个参数都为空,则返回NULL。Ifnull()必须有确切的两个参数。ifnull()函数等效于使用两个参数合并()。
https://stackoverflow.com/questions/38265881
复制相似问题