4

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

我的查询是:

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

EmploymentType可以包含一个IntegerNULL

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

4

3 回答 3

4

我将这个问题解释为优先事项。如果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,如果存在的话。

于 2015-01-16T13:19:10.227 回答
4

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

如果我正确理解您的问题,您需要选择具有NULL3列的行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必须添加一个子句。

关于MySQL的文档NULL说:

执行时,如果您执行ORDER BYNULL则首先显示值,如果执行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
于 2015-01-16T13:27:16.183 回答
1

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

IF(condition, expres1, expres2) 

这意味着如果条件满足则返回表达式 1 否则表达式 2

SELECT (@v:=2) AS Row, CL.LeaveTypeId, CL.NumberOfLeave
FROM `CompanyLeave` CL
WHERE IF(CL.EmploymentType IS NULL, 0, CL.EmploymentType) = 3;
于 2015-01-16T13:19:21.457 回答