我在数据库中遇到过这样的查询:
SELECT col_a
FROM my_table
WHERE
nvl(col_b, 0) in
nvl(nvl(:arg, col_b), 0)
Run Code Online (Sandbox Code Playgroud)
这将从我的表返回col_a,其中:
这似乎是一种非常复杂的方式来返回与输入参数匹配的一个或所有记录,或者只是根据输入参数的值选择整个表.
有没有更简单的方法来达到同样的效果?
另外,我注意到NVLOracle是特定的,在这个实例中使用它有什么好处COALESCE吗?
这是相当复杂的.我会比较喜欢:
SELECT col_a
FROM my_table
WHERE (col_b = :arg OR :arg IS NULL)
Run Code Online (Sandbox Code Playgroud)
NVL相对于COALESCE没有任何好处,实际上相反.但是,NVL在Oracle中的使用时间更长(并且打字时间更短),因此往往会得到更多使用.
编辑:实际上,我的答案与原始SQL没有完全相同,我怀疑是错误的:if:arg = 0然后原始SQL将返回col_b为null或0的行!