我有一个表“动物”,其中列出了几只动物,每只动物都有一个 animal_id ,一个区域设置和一个名称对于语言环境, name 可以为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
我希望拥有特定区域设置的所有名称,但某些动物的特定区域设置的名称(如对于 locale = de_DE),fox的名称上方为空,所以以下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
如果某个语言环境的名称为空我想检索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的 locale 的 name :
------------------------
animal_id | name
------------------------
"10-3-5" | "dog"
"10-3-7" | "fox"
我该怎么办?
提前致谢!
答案 0 :(得分:1)
你走在正确的轨道上:
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参数的副本,如果两个参数都为NULL,则返回NULL。 Ifnull()必须有两个参数。 ifnull()函数等效于带有两个参数的coalesce()。