首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果结果为null,如何选择其他行?

如果结果为null,如何选择其他行?
EN

Stack Overflow用户
提问于 2016-07-08 11:50:12
回答 1查看 141关注 0票数 2

我有一个表“动物”,其中列出了几个动物,每个动物都有一个animal_id、一个区域设置,以及一个与区域设置相对应的名称,名称可以为null。这张桌子看起来像:

代码语言:javascript
复制
--------------------------------------------
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:

代码语言:javascript
复制
SELECT 
    animal.animal_id,
    animal.name
FROM animal 
WHERE animal.locale = "de_DE";

给出

代码语言:javascript
复制
------------------------
animal_id  |   name 
------------------------
"10-3-5"   |   "hund"
"10-3-7"   |   NULL

如果某个特定区域设置的名称为null,则我希望检索en_US区域设置的名称,我想要的结果是:

代码语言:javascript
复制
------------------------
animal_id  |   name 
------------------------
"10-3-5"   |   "hund"
"10-3-7"   |   "fox"

我尝试了以下查询:

代码语言:javascript
复制
SELECT 
animal.animal_id,
IFNULL(animal.name, (SELECT animal.name FROM animal WHERE animal.locale="en_US"))
FROM animal 
WHERE animal.locale = "de_DE";

但结果是不正确的,我其实也不明白:

代码语言:javascript
复制
------------------------
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"

我也试过:

代码语言:javascript
复制
SELECT
animal.animal_id,
animal.name
FROM animal WHERE ((animal.locale = "de_DE" AND animal.name != NULL) 
                    OR  animal.locale = "en_US");

然后只返回与en_US相等的地区名称:

代码语言:javascript
复制
------------------------
animal_id  |   name 
------------------------
"10-3-5"   |   "dog"    
"10-3-7"   |   "fox"

我该怎么做?

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-08 13:52:26

你走在正确的轨道上:

代码语言:javascript
复制
    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()函数等效于使用两个参数合并()。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38265881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档