我如何在 Where 子句中使用 IFNULL

How can i use IFNULL in Where clause

我想以这样一种方式使用 IFNULL(),即我可以 select 包含 NULL 的记录,或者,如果存在值,则 select 匹配特定值的记录。

我的查询是:

SELECT (@v:=2) AS Row, CL.LeaveTypeId, CL.NumberOfLeave
FROM `CompanyLeave` CL
WHERE(IFNULL(CL.EmploymentType,0)=3);

EmploymentType 可以包含 IntegerNULL

我要 select 匹配指定值的记录,或者,如果 none 匹配,则包含 NULL.

的记录

我将这个问题解释为优先顺序。如果存在 3 的记录,请选择该记录。否则,选择 NULL,如果它存在。

如果是这样,这可能会满足您的要求:

SELECT (@v:=2) AS Row, CL.LeaveTypeId, CL.NumberOfLeave
FROM `CompanyLeave` CL
WHERE CL.EmployementType = 3 or CL.EmployementType IS NULL
ORDER BY (CL.EmployementType = 3) DESC
LIMIT 1;

这将 return 包含 3 的行(如果存在)。否则,它会 return 一行 NULL,如果存在的话。

您可以使用 IF 语句 代替 IFNULL()

IF(condition, expres1, expres2) 

表示如果满足条件则return expres1 else expres2

SELECT (@v:=2) AS Row, CL.LeaveTypeId, CL.NumberOfLeave
FROM `CompanyLeave` CL
WHERE IF(CL.EmploymentType IS NULL, 0, CL.EmploymentType) = 3;

表达式IFNULL(CL.EmploymentType, 3) 的基本意思是:如果CL.EmploymentType IS NULL 则使用3。如果不是NULL,则使用CL.EmploymentType的原始值。

如果我对你的问题的理解正确,你需要 select CL.EmploymentType 列中具有 NULL3 的行。
查询是:

SELECT (@v:=2) AS Row, CL.LeaveTypeId, CL.NumberOfLeave
FROM `CompanyLeave` CL
WHERE IFNULL(CL.EmploymentType, 3) = 3;

更新:

如果只返回一行(具有 3 的行优于具有 NULL 的行),则必须使用放置 NOT NULL 值的条件对这些行进行排序在前面并且必须添加一个 LIMIT 1 子句。

MySQL documentation about NULL 说:

When doing an ORDER BY, NULL values are presented first if you do ORDER BY ... ASC and last if you do ORDER BY ... DESC.

更新后的查询是:

SELECT (@v:=2) AS Row, CL.LeaveTypeId, CL.NumberOfLeave
FROM `CompanyLeave` CL
WHERE IFNULL(CL.EmploymentType, 3) = 3;
ORDER BY CL.EmploymentType DESC
LIMIT 1