2017-10-16 68 views
0

關於範圍數組(例如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[]); 

所以,檢查是否或都是存在的,需要像

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

'選擇T * ...'? –

+1

嗨@a_horse_with_no_name yes,'t。*',但沒有't'在未登錄的上下文中。 –

回答

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) 
相關問題