2017-10-16 5 views
0

À propos du tableau de gammes (par exemple int4range[]) et range functions.Élégant moyen de vérifier l'élément dans un tableau de gammes

Table Suppose t comme

CREATE TABLE t (id serial, r int4range[]); 
INSERT INTO t (r) VALUES 
    ('{"[2,5]","[100,200]"}'::int4range[]), 
    ('{"[6,9]","[201,300]"}'::int4range[]); 

Donc, pour vérifier si ou sont là, ont besoin d'une requête comme

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 

Il y a une façon de faire moins laid ce genre de requêtes?


REMARQUE: besoin d'un « modèle » générique pour créer des fonctions qui renvoie la table requête simple *,

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; 

Ainsi, la même requête est SELECT * FROM t_where(7),
mais j'ai besoin (d'une manière élégante) pour construire en utilisant *, ne pas énumérer les champs (id,r).

+0

'select * t ...'? –

+1

Salut @a_horse_with_no_name oui, 't. *', Mais il n'y a pas de 't' dans le contexte non-testé. –

Répondre

1

Vous n'avez pas besoin d'un sous-requête, vous pouvez utiliser un LATERAL JOIN implicite, vous donnant accès à t.* dans la principale SELECT.

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