我如何在Where子句中使用IFNULL

时间:2015-01-16 13:15:58

标签: mysql sql ifnull

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

我的查询是:

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

EmploymentType可以包含IntegerNULL

我想选择与指定值匹配的记录,或者,如果没有匹配,则选择包含NULL的记录。

3 个答案:

答案 0 :(得分:2)

我将这个问题解释为优先顺序。如果存在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;

这将返回3行,如果存在的话。否则,如果存在NULL,它将返回{{1}}行。

答案 1 :(得分:2)

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

如果我理解您的问题,您需要在3列中选择CL.EmploymentTypeSELECT (@v:=2) AS Row, CL.LeaveTypeId, CL.NumberOfLeave FROM `CompanyLeave` CL WHERE IFNULL(CL.EmploymentType, 3) = 3; 的行。
查询是:

3

<强>更新

如果只返回一行(NULL优先于NOT NULL的那一行),则必须使用将LIMIT 1值放在前面的标准对行进行排序并且必须添加ORDER BY子句。

MySQL documentation about NULL说:

  

执行NULL时,如果您执行ORDER BY ... ASC,则会先显示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 ,则会显示最后一个值。

更新的查询是:

{{1}}

答案 2 :(得分:1)

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

IF(condition, expres1, expres2) 

这意味着如果满足条件,则返回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;