忽略 SQL 中的空绑定变量
Ignore Null Bind Variables in SQL
我正在尝试创建一个动态 SQL 语句,它可用于根据多个参数进行过滤。但需要注意的是,并非所有参数都可用,因此可以是 4 个变量,也可以是 0 个。
这是我创建此查询的尝试(只有一个变量的小示例):
SELECT FIRST_NAME, LAST_NAME
FROM USERS
WHERE (CASE WHEN :1 IS NULL THEN 1 = 1 ELSE FIRST_NAME = :1 END;
然而,这会引发编译错误,所以我想知道是否有其他方法可以实现它?
您可以使用:
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);
作为替代方案,您可以使用 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 语句,它可用于根据多个参数进行过滤。但需要注意的是,并非所有参数都可用,因此可以是 4 个变量,也可以是 0 个。
这是我创建此查询的尝试(只有一个变量的小示例):
SELECT FIRST_NAME, LAST_NAME
FROM USERS
WHERE (CASE WHEN :1 IS NULL THEN 1 = 1 ELSE FIRST_NAME = :1 END;
然而,这会引发编译错误,所以我想知道是否有其他方法可以实现它?
您可以使用:
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);
作为替代方案,您可以使用 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;