如果一个结果为null,则Sqlite如何选择其他行

时间:2016-07-08 11:50:13

标签: sqlite select

我有一个表“动物”,其中列出了几只动物,每只动物都有一个 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"

我该怎么办?

提前致谢!

1 个答案:

答案 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()。