【发布时间】:2015-09-27 04:32:54
【问题描述】:
我发现了很多关于 SELECT 的问题和解答,不包括值为“NOT IN”的行和子查询(例如 this)。但是如何排除值列表而不是子查询?
我想搜索时间戳在某个范围内但排除某些特定日期时间的行。在英语中,这将是:
选择今天中午到下午 2 点之间记录的所有 ORDER 行,以下时间除外:今天 12:34、今天 12:55 和今天 13:05。
SQL 可能类似于:
SELECT *
FROM order_
WHERE recorded_ >= ?
AND recorded_ < ?
AND recorded_ NOT IN ( list of date-times… )
;
所以这个问题的两个部分:
- 如何编写 SQL 以排除具有任何值列表的行?
- 如何在 JDBC 中为
PreparedStatement设置任意数量的参数?
(任意数量是要排除的值列表的计数)
【问题讨论】:
-
您的 SQL 将按照说明排除值。 stackoverflow.com/questions/178479/… 回答 NOT IN 列表。
-
你想要
recorded_ <> ALL( ? ),参数类型为timestamp[]。不过,不确定如何通过 JDBC 输入。 -
@NickBarnes:
NOT IN实际上与<> ALL(): stackoverflow.com/a/31192557/939860 相同。两者的问题:如果表达式的任一侧都涉及 NULL,它们就会失败。该表达式的计算结果为 NULL;但只有 TRUE 通过WHERE条件:stackoverflow.com/a/19528722/939860 -
如 cmets 中所述,
NOT IN (...)等同于<> ALL (ARRAY[...])。您可以使用createArrayOf在 JDBC 中创建一个数组,然后将其作为参数传递。
标签: sql postgresql jdbc where-in