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

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

这将从我的表中返回col_a,其中:
  • col_b ==:arg
  • 或:arg为null返回整个表

  • 这似乎是一种复杂的方法,用于返回与输入参数匹配的一个或所有记录,或者仅根据输入参数的值选择整个表。

    有没有更简单的方法可以达到相同的效果?

    另外,我注意到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的行!

    10-06 04:12