我希望以这样一种方式使用IFNULL()
,我可以选择包含NULL的记录,或者如果存在值,则选择与特定值匹配的记录。
我的查询是:
SELECT (@v:=2) AS Row, CL.LeaveTypeId, CL.NumberOfLeave
FROM `CompanyLeave` CL
WHERE(IFNULL(CL.EmploymentType,0)=3);
列EmploymentType
可以包含Integer
或NULL
。
我想选择与指定值匹配的记录,或者,如果没有匹配,则选择包含NULL
的记录。
答案 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.EmploymentType
或SELECT (@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;