Я нашел много вопросов и ответов о SELECT, исключая строки со значением «НЕ В» подзапросе (например, это). Но как исключить список значений, а не подзапрос?
Я хочу найти строки, временная метка которых находится в диапазоне, но исключить некоторые конкретные даты и время. На английском это будет:
Выберите все строки ORDER, записанные между полуднем и 14:00 сегодня, за исключением тех, в которых указано это время: Сегодня 12:34, Сегодня 12:55 и Сегодня 13:05.
SQL может быть примерно таким:
SELECT *
FROM order_
WHERE recorded_ >= ?
AND recorded_ < ?
AND recorded_ NOT IN ( list of date-times… )
;
Итак, две части этого вопроса:
- Как написать SQL, чтобы исключить строки, имеющие любой список значений?
- Как установить произвольное количество аргументов в
PreparedStatement
в JDBC?
(произвольное число является подсчетом списка значений, которые нужно исключить)
recorded_ <> ALL( ? )
с параметром типаtimestamp[]
. Однако не уверен, как передать это через JDBC. - person Nick Barnes   schedule 09.07.2015NOT IN
фактически совпадает с<> ALL()
: stackoverflow.com/a/31192557/939860. Проблема с обоими: они терпят неудачу, если NULL задействован с любой стороны выражения. Выражение оценивается как NULL; но только TRUE проходит условиеWHERE
: stackoverflow.com/a/19528722/939860 - person Erwin Brandstetter   schedule 09.07.2015NOT IN (...)
эквивалентно<> ALL (ARRAY[...])
. Вы можете создать массив в JDBC с помощьюcreateArrayOf
, а затем передать его в качестве параметра. - person Craig Ringer   schedule 09.07.2015