如何在绑定变量中传递空值

Sha*_*Mia 4 sql oracle plsql

这是一个示例查询,显示我正在尝试获取名为“sql for every”的书,其 begin_date 为“2018-02-02”,其中 authName 为 null。这个查询完全没问题。它返回类似于下面屏幕截图中的一行。

SELECT
  bookName,
  begin_date,
  authName
FROM bookwh
WHERE bookName = :bname
AND begin_date = :dt
AND authName IS NULL
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我的问题是如何将 null 作为绑定变量传递?例如,authName = :a_null 我应该能够传递 null

Sam*_*m M 5

NULL 是子句中的一种特殊情况WHERE,在测试相等性时不起作用。对于 null,您只能测试IS NULLor IS NOT NULL

完成您想要的任务的一种方法是将相等性检查包装在 nvl 包装器中。该nvl()函数有 2 个参数。第一个参数是一个值(在您的情况下是绑定参数),第二个值是默认值(如果第一个参数为 null)。

AND authName = nvl(:your_bind_parameter, authName)
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用 OR 语句。

AND (authName = :your_bind_parameter OR authName IS NULL)
Run Code Online (Sandbox Code Playgroud)

NVL()处理空绑定参数的干净方法。这两种方法都会对性能产生影响,因此请检查您的解释计划。

有关选项的更全面说明,请查看 Oracle 网站上的博客: https: //blogs.oracle.com/sql/optional-search-parameters :-getting-rid-of-those-pesky-or-conditions 。