IN в частности те записи, в которых колонки попадающие под условие содержали NULL ?
Пример:
1. Таблица t(id integer, a text, b text), с тремя записями (a,b):
1|qwe|1т
2|[NULL]|2т
3|тест|3т
2. Следующий запрос:
SELECT * FROM t WHERE a NOT IN ('тест')
Вернет только запись с id = 1. Задача же стоит в том, чтобы по условию выше вернулись строки с id = 1;2.
Понятно, что это происходит от того что при попытке сравнения на равенство NULL с чем либо PostgreSQL возвращает NULL (и для таких случаев есть IS [NOT] NULL).
Также понятно, что можно добавить условие OR a IS NULL, но это мне не нравится (представьте, например, что в IN несколько колонок и на проверку условия подаются кортежи). Включать transform_null_equals тоже желания нет.
NOT EXISTS ?
А представьте такой случай: SELECT * FROM t WHERE (a,b) NOT IN (('тест', '3т'), ('qwe', '1т')) Он показателен тем, что такая конструкция весьма удобна в случае когда нужно соответственно сравнить некоторое кол-во столбцов со списком кортежей. Как это переделать в EXIST используя такой же "минимализм" что-то не не приходит в голову...
select * from t where not exists (select from (values('тест', '3т'), ('qwe', '1т')) q where a = q.column1 and b = q.column2) ?
В принципе подойдёт. Спасибо!
Обсуждают сегодня