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
,这对于任何值都不可能是真的。