我正在使用PostgreSQL中的SQL查询来过滤位于bigint范围内的值。问题是null不在该范围内,因此所有null值也会被过滤,这不是我想要的系统。这是当前查询:
select *
from table_test
where '[0,2147483647]'::int8range @> ALL(ARRAY[field1, field2, field3])
输入:
field1 field2 field3
1 null null
2 null 3
3 1000 19
4 63 3623511495
当前输出:
field1 field2 field3
3 1000 19
预期输出:
1 null null
2 null 3
3 1000 19
如何将null作为可能的值添加到bigint的范围?
您可以简单地使用
SELECT *
FROM table_test
WHERE '[0,2147483647]'::int8range
@> ALL(ARRAY[coalesce(field1, 0),
coalesce(field2, 0),
coalesce(field3, 0)]);
就像戈登·利诺夫的评论所说。
不太可爱,但更易于使用索引支持
SELECT *
FROM table_test
WHERE coalesce(field1, 0) BETWEEN 0 AND 2147483647
AND coalesce(field2, 0) BETWEEN 0 AND 2147483647
AND coalesce(field3, 0) BETWEEN 0 AND 2147483647;