在SQL查询中替换NVL

时间:2011-07-27 11:42:20

标签: sql oracle plsql

我在数据库中遇到过这样的查询:

SELECT col_a
FROM my_table
WHERE
  nvl(col_b, 0) in
    nvl(nvl(:arg, col_b), 0)

这将从我的表中返回col_a,其中:

  • col_b ==:arg
  • 或if:arg为null返回整个表

这似乎是一种非常复杂的方式来返回与输入参数匹配的一个或所有记录,或者只是根据输入参数的值选择整个表。

有没有更简单的方法来达到同样的效果?

另外,我注意到NVL是特定于Oracle的,在此实例中使用COALESCE是否有任何好处?

1 个答案:

答案 0 :(得分:6)

相当令人费解。我更喜欢:

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!