如果传递空值,则返回所有行

3

我有一个类似这样的查询:

select empno,name
from emp
where job = 'CLERK'
and empno = :empno

如果我传入的empno是null,我想显示所有符合条件job='CLERK'的记录。如果empno是一个具体的数字,则应该按照job和empno进行筛选。

有没有一种在不使用PLSQL的情况下在SQL中实现这个功能的方法?

2个回答

7
and (empno = :empno or :empno is null)

1
把这些条件的顺序颠倒,先对 null 进行检查会更好吗?即使 SQL 引擎会优化它,我觉得另一种方式更可读... - Simon MᶜKenzie

3
如果传递的参数为空,则将其替换为实际列值,类似于这样...
select empno,name from emp where 
job = 'CLERK' 
and empno = NVL(:empno ,empno)

NVL的工作原理

NVL函数的语法如下:

NVL( string1, replace_with )

string1 is the string to test for a null value.

replace_with is the value returned if string1 is null.

我会避免这样做。它的目的不太明确,因为它依赖于逻辑等价性 "x = x",这很令人困惑。它还稍微混淆了逻辑,对于不熟悉该函数的用户来说,NVL 的功能是未知的。@Andomar 的答案更清晰,因为它只依赖于描述性的逻辑运算符。 - Polynomial
你测试过这个了吗?我认为在Oracle中,一个null不等于另一个null,所以这可能行不通。 - Nick Loach

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接