MYSql中空值的比较

MYSql中空值的比较,mysql,sql,Mysql,Sql,我在where子句中有一个条件,如: LocationId=IFNULL(LocId,LocationId) 这里LocId为NULL,因此通过IFNUll返回LocationId,在本例中也是NULL,该查询不返回任何内容。 请告诉我解决办法 试试看: LocationId=IFNULL(LocId,LocationId) AND LocationId IS NOT NULL 或 mysql NULL不等于NULL,请检查此处 因为与NULL进行任何算术比较的结果也是 NULL,则无法从此

我在where子句中有一个条件,如:

LocationId=IFNULL(LocId,LocationId)
这里LocId为NULL,因此通过IFNUll返回LocationId,在本例中也是NULL,该查询不返回任何内容。 请告诉我解决办法

试试看:

LocationId=IFNULL(LocId,LocationId)
AND LocationId IS NOT NULL


mysql NULL不等于NULL,请检查此处

因为与NULL进行任何算术比较的结果也是 NULL,则无法从此类比较中获得任何有意义的结果

在MySQL中,0或NULL表示false,其他任何内容都表示true。这个 布尔运算的默认真值为1

所以,你的逻辑应该是这样的:

select ...
from ...
where
(
    (LocId is null and LocationId is null)
    OR
    (LocId is not null and LocationId = LocId)
)
LocId IS NULL and LocationId IS NULL
OR
LocId IS NOT NULL and LocationId = LocId
您可以将其写得更短,通常ID是正值,因此您可以比较:

select ...
from ...
where
ifnull(LocId, -1) = ifnull(LocationId, -1)

更新:在mysql中还存在非ansi标准,即更短的版本,请检查@Ja͢ck answer

您应该了解,您不能使用任何

唯一的选择是使用
为空
为非空

因此,您需要像这样尝试:

select ...
from ...
where
(
    (LocId is null and LocationId is null)
    OR
    (LocId is not null and LocationId = LocId)
)
LocId IS NULL and LocationId IS NULL
OR
LocId IS NOT NULL and LocationId = LocId
您可以使用操作员:

LocationId <=> IFNULL(LocId, LocationId)
LocationId IFNULL(LocId,LocationId)
常规
=
运算符之间的区别在于
null
值未被视为特殊值,例如,如果左侧和右侧参数均为
null
,则将产生
1


有关更多示例,请参见。

请添加您的查询、示例数据和预期结果。IFNULL(E.LocationId,-1)=COALESCE(LocId,E.LocationId,-1)我将其用于我的解决方案,并给出预期结果。Thanks@ManishKumar是的,如果您需要在存在null locid的情况下返回所有值