关于范围数组(例如int4range[]
)和range functions。
假设表格t
为
CREATE TABLE t (id serial, r int4range[]);
INSERT INTO t (r) VALUES
('{"[2,5]","[100,200]"}'::int4range[]),
('{"[6,9]","[201,300]"}'::int4range[]);
因此,要检查 7 或 70 是否存在,需要查询
SELECT * FROM (SELECT *, unnest(r) as ur FROM t) t2 WHERE 7<@ur; -- row2
SELECT * FROM (SELECT *, unnest(r) as ur FROM t) t2 WHERE 70<@ur; -- empty
进行此类查询有一种不那么难看的方法吗?
注意:需要一个通用的“模板”来构建使用简单*
查询返回表的函数,
CREATE FUNCTION t_where(int4) RETURNS t AS $f$
SELECT id,r -- but need *
FROM ( SELECT *, unnest(r) as ur FROM t) t2
WHERE $1 <@ ur
$f$ LANGUAGE SQL IMMUTABLE;
所以相同的查询是SELECT * FROM t_where(7)
,但我需要(一种优雅的方式)使用*
进行构建,而不是列出字段(id,r
)。
答案 0 :(得分:1)
您不需要子查询,可以使用隐式LATERAL JOIN
,从而可以访问主t.*
中的SELECT
:
#= SELECT t.*
FROM t, unnest(r) AS ur
WHERE 7<@ur;
┌────┬────────────────────────┐
│ id │ r │
├────┼────────────────────────┤
│ 2 │ {"[6,10)","[201,301)"} │
└────┴────────────────────────┘
(1 row)