我在数据库中遇到过这样的查询:
SELECT col_a
FROM my_table
WHERE
nvl(col_b, 0) in
nvl(nvl(:arg, col_b), 0)
这将从我的表中返回col_a,其中:
这似乎是一种复杂的方法,用于返回与输入参数匹配的一个或所有记录,或者仅根据输入参数的值选择整个表。
有没有更简单的方法可以达到相同的效果?
另外,我注意到
NVL
是Oracle特定的,在这种情况下使用它比COALESCE
有什么好处吗? 最佳答案
它相当复杂。我会选择:
SELECT col_a
FROM my_table
WHERE (col_b = :arg OR :arg IS NULL)
NVL没有超过COALESCE的好处,实际上是相反的。但是,NVL在Oracle中的使用时间更长(并且类型更短),因此倾向于被更多地使用。
编辑:实际上,我的回答与原始SQL并不太相同,我怀疑这是错误的:如果:arg = 0,那么原始SQL将返回col_b为null或0的行!