Null -включая поиск в Postgresql с использованием одного заполнителя

#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 например, так).