MySQL-为什么在null和if为null的情况下会产生不同的结果?

MySQL-为什么在null和if为null的情况下会产生不同的结果?,mysql,sql,if-statement,case,Mysql,Sql,If Statement,Case,我有一个类似这样的问题: SELECT IF(b.field IS NULL, c.field, b.field) as `field` FROM aaaaa a LEFT OUTER JOIN bbbbb b ON b.uid = a.b_id LEFT OUTER JOIN ccccc c ON c.uid = a.c_id; 这个查询有效。我的问题是,当以下情况(使用案例)不起作用时,上一个查询为什么起作用: SELECT CASE b.field

我有一个类似这样的问题:

SELECT IF(b.field IS NULL, c.field, b.field) as `field`
FROM aaaaa a
LEFT OUTER JOIN bbbbb b
    ON b.uid = a.b_id
LEFT OUTER JOIN ccccc c
    ON c.uid = a.c_id;
这个查询有效。我的问题是,当以下情况(使用
案例
)不起作用时,上一个查询为什么起作用:

SELECT 
    CASE b.field 
        WHEN NULL THEN c.field
        ELSE b.field
    END as `field`
FROM aaaaa a
LEFT OUTER JOIN bbbbb b
    ON b.uid = a.b_id
LEFT OUTER JOIN ccccc c
    ON c.uid = a.c_id;
假设
aaaaa.b_id
aaaaa.c_id
将为空;决不能两者兼而有之,也决不能两者兼而有之。还假设
aaaaa
bbbbb
ccccccc
之间的外键都已正确配置。rehl x86_64上的mysql v5.1.60


第一个查询正确地返回了预期的结果,但是当我使用
案例时,我只返回了
ELSE
满足时的值(没有
c.field
s返回,只有
b.field
s返回)。给出了什么?

这是因为
case
的形式检查条件
b.field=null
,并且您不能以这种方式比较null值

改用这种形式的
案例

CASE
    WHEN b.field IS NULL THEN c.field
    ELSE b.field
END as `field`
您还可以为此使用
合并

COALESCE(b.field, c.field) as `field`
ifnull

IFNULL(b.field, c.field) as `field`

这是因为
case
的形式检查条件
b.field=null
,您无法以这种方式比较null值

改用这种形式的
案例

CASE
    WHEN b.field IS NULL THEN c.field
    ELSE b.field
END as `field`
您还可以为此使用
合并

COALESCE(b.field, c.field) as `field`
ifnull

IFNULL(b.field, c.field) as `field`

这是因为
case
的形式检查条件
b.field=null
,您无法以这种方式比较null值

改用这种形式的
案例

CASE
    WHEN b.field IS NULL THEN c.field
    ELSE b.field
END as `field`
您还可以为此使用
合并

COALESCE(b.field, c.field) as `field`
ifnull

IFNULL(b.field, c.field) as `field`

这是因为
case
的形式检查条件
b.field=null
,您无法以这种方式比较null值

改用这种形式的
案例

CASE
    WHEN b.field IS NULL THEN c.field
    ELSE b.field
END as `field`
您还可以为此使用
合并

COALESCE(b.field, c.field) as `field`
ifnull

IFNULL(b.field, c.field) as `field`

合并工作完美!我想我会这样做,但我尝试将“b.field IS”部分添加到WHEN中,但它仍然没有按预期返回值。coalesce和if方法可以工作,但我仍然很好奇这个案例到底是怎么回事@乔恩贝斯特:真奇怪,它应该真的有用。你注意到它只有
案例
而没有
案例b.field
?打得好……这正是我做错的地方!我没有注意到它需要的情况下,当。那么,如果将
b.field
置于case和when之间,我(在SQL中)是怎么说的呢?@JonBest:您将得到条件
b.field=b.field为null
,这对于任何值都不可能是真的。COALESCE工作得非常完美!我想我会这样做,但我尝试将“b.field IS”部分添加到WHEN中,但它仍然没有按预期返回值。coalesce和if方法可以工作,但我仍然很好奇这个案例到底是怎么回事@乔恩贝斯特:真奇怪,它应该真的有用。你注意到它只有
案例
而没有
案例b.field
?打得好……这正是我做错的地方!我没有注意到它需要的情况下,当。那么,如果将
b.field
置于case和when之间,我(在SQL中)是怎么说的呢?@JonBest:您将得到条件
b.field=b.field为null
,这对于任何值都不可能是真的。COALESCE工作得非常完美!我想我会这样做,但我尝试将“b.field IS”部分添加到WHEN中,但它仍然没有按预期返回值。coalesce和if方法可以工作,但我仍然很好奇这个案例到底是怎么回事@乔恩贝斯特:真奇怪,它应该真的有用。你注意到它只有
案例
而没有
案例b.field
?打得好……这正是我做错的地方!我没有注意到它需要的情况下,当。那么,如果将
b.field
置于case和when之间,我(在SQL中)是怎么说的呢?@JonBest:您将得到条件
b.field=b.field为null
,这对于任何值都不可能是真的。COALESCE工作得非常完美!我想我会这样做,但我尝试将“b.field IS”部分添加到WHEN中,但它仍然没有按预期返回值。coalesce和if方法可以工作,但我仍然很好奇这个案例到底是怎么回事@乔恩贝斯特:真奇怪,它应该真的有用。你注意到它只有
案例
而没有
案例b.field
?打得好……这正是我做错的地方!我没有注意到它需要的情况下,当。那么,如果将
b.field
置于case和when之间,我(在SQL中)是怎么说的呢?@JonBest:您将得到条件
b.field=b.field为null
,这对于任何值都不可能是真的。