我们在我们的系统中发现了一个如下所示的 SQL 查询:
SELECT *, tid FROM x WHERE tid IN (213, 214, 215, 216, -1)
实际数字来自其他地方,但我们总是在查询末尾附加 -1,所以我尝试删除它。经过一番调查为什么它会破坏系统后,我将问题缩小到数据库:
SELECT tid FROM x WHERE tid IN (213) -- 213
SELECT tid FROM x WHERE tid IN (213, 214) -- 214
SELECT tid FROM x WHERE tid IN (213, 214, 215) -- 214, 215
SELECT tid FROM x WHERE tid IN (213, 214, 215, -1) -- 213, 214, 215
SELECT tid FROM x WHERE tid IN (5000) -- 5000
SELECT tid FROM x WHERE tid IN (213, 5000) -- 5000
SELECT tid FROM x WHERE tid IN (215, 214, 213, 2147000000) -- 215, 214
SELECT tid FROM x WHERE tid = 1 OR tid = 2 -- 2
似乎如果 in-list 有多个元素,Ingres 会忽略其中最小的一个。它仅在查询 tid 时发生,不会发生在任何其他列上。当它在列表中或只是多个 OR 时也无关紧要,总是忽略最低值。最后,它只在这个 SELECT 中表现得像这样,对于 DELETE 它工作正常。
知道为什么 Ingres 可能会这样做吗?