优雅的方式来检查范围数组中的项目

时间:2017-10-16 18:48:49

标签: postgresql

关于范围数组(例如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)。

1 个答案:

答案 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)