2017-10-16 9 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

'トンを選択* ...'? –

+1

こんにちは@a_horse_with_no_nameはい、 't。*'ですが、ネストされていないコンテキストには 't'はありません。 –

答えて

1

、あなたがメインSELECTt.*へのアクセスを与えて、暗黙のLATERAL JOINを使用することができます。

#= SELECT t.* 
    FROM t, unnest(r) AS ur 
    WHERE 7<@ur; 
┌────┬────────────────────────┐ 
│ id │   r   │ 
├────┼────────────────────────┤ 
│ 2 │ {"[6,10)","[201,301)"} │ 
└────┴────────────────────────┘ 
(1 row) 
関連する問題