#sql #postgresql #jdbc #where-clause #sql-null
#sql #postgresql #jdbc #where-предложение #sql-null
Вопрос:
Наличие таблицы
CREATE TABLE t (x int)
INSERT INTO t VALUES (null), (0) ,(42)
И запрос с двумя заполнителями:
SELECT x FROM t WHERE x = ? OR x IS NULL AND ? IS NULL
Логика следующая: если я разрешу эти заполнители с 42
помощью it returns 42
. Если я разрешу их с null
помощью возврата null
. Другими словами, это поиск с нулевым включением.
Вопрос в том:
Можно ли переписать этот запрос (в Postgresql), чтобы иметь один заполнитель ?
вместо двух?
Комментарии:
1.
x is not distinct from ?
Ответ №1:
Postgres реализует нулевое безопасное равенство через operator IS [NOT] DISTINCT FROM
, что является именно тем, о чем вы просите.
Итак:
SELECT x FROM t WHERE x IS NOT DISTINCT FROM ?
Ответ №2:
Заполнителем для параметров в PostgreSQL является $1
$2
, и т.д. ?
Некоторые драйверы для удобства реализуют возможность использования вместо этого, но они предлагают меньшую гибкость.
Используя реальную нотацию, вы можете указать, что один параметр встречается более чем в одном месте:
SELECT x FROM t WHERE x = $1 OR x IS NULL AND $1 IS NULL
Это имеет преимущество перед IS NOT ОТЛИЧНОЕ от того, что он может использовать индекс.
Ответ №3:
ДА. Вы можете использовать is not distinct from
и использовать только один заполнитель:
where x is not distinct from ?
is distinct from
/ is not distinct from
являются null
безопасными операторами сравнения, которые обрабатываются null
как «реальное» значение для целей сравнения ( null = null
например, так).