忽略 SQL 中的空绑定变量

Posted

技术标签:

【中文标题】忽略 SQL 中的空绑定变量【英文标题】:Ignore Null Bind Variables in SQL 【发布时间】:2021-08-17 21:18:45 【问题描述】:

我正在尝试创建一个动态 SQL 语句,可用于基于多个参数进行过滤。但需要注意的一点是,并非所有参数都可用,因此可以有 4 个变量,也可以是 0。

这是我创建这个查询的尝试(只有一个变量的小例子):

SELECT FIRST_NAME, LAST_NAME
FROM USERS
WHERE (CASE WHEN :1 IS NULL THEN 1 = 1 ELSE FIRST_NAME = :1 END;

但是这会引发编译错误,所以我想知道是否有其他方法可以实现它?

【问题讨论】:

where (:1 IS NULL OR FIRST_NAME = :1) AND (:2 etc 【参考方案1】:

你可以使用:

SELECT FIRST_NAME, LAST_NAME
FROM USERS
WHERE (:1 IS NULL OR FIRST_NAME  = :1)
AND   (:2 IS NULL OR LAST_NAME   = :2)
AND   (:3 IS NULL OR SPECIES     = :3)
AND   (:4 IS NULL OR HOME_PLANET = :4);

【讨论】:

即使 FIRST_NAME、LAST_NAME 等本身为空,这也应该可以工作,对吧?这也应该返回那些记录? @Chen 如果:1NULL,那么它将匹配任何FIRST_NAME,无论它是NULL 还是非NULL 是的,做了一个快速测试,它成功了,非常感谢。【参考方案2】:

作为替代方案,您可以使用DECODE,这样您就不必将每个搜索参数绑定两次。比如:

SELECT first_name, last_name
FROM users u
WHERE DECODE(:1, NULL, 1, u.first_name, 1, 0) = 1
AND DECODE(:2, NULL, 1, u.last_name, 1, 0) = 1;

【讨论】:

以上是关于忽略 SQL 中的空绑定变量的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PHP 中绑定 SQL 变量?

PL/SQL 中的变量;总是绑定变量?

如何将 R 会话中的值替换为 SQL 绑定变量占位符?

如何在pl/sql中执行绑定变量?

sqlplus pl/sql Date/Time 用户输入理解为绑定变量

Snowflake 中的列绑定变量