2017-03-04 3 views
1

Ich habe eine Tabelle t1postgresql Suchtext in Reihe Text

id | names 
----|------------------------- 
1 | {jully , alex , sarah} 
2 | {bety , cate , jenifer} 
3 | {adam , pit , joee} 
4 | {piter , mat , andy} 

so, ich brauche Reihen mindestens einen Namen haben, der mit „a“ das Ergebnis i in der unten benötigen beginnen

in Reihe 1: Alex

in Reihe 3: Adam

in Zeile 4: Andy

id | names 
-----|------------------------- 
1 | {jully , alex , sarah} 
3 | {adam , pit , joee} 
4 | {piter , mat , andy} 

eine Abfrage wie es

select * from t1 where 'a' like% any t1.name 

Antwort

1
select * 
from (
    select id, unnest(names) as name 
    from t 
) s 
where name like 'a%'; 
id | name 
----+------ 
    1 | alex 
    3 | adam 
    4 | andy 

es aggregiert haben:

select id, array_agg(name) 
from (
    select id, unnest(names) as name 
    from t 
) s 
where name like 'a%' 
group by id; 
id | array_agg 
----+----------- 
    4 | {andy} 
    1 | {alex} 
    3 | {adam} 
+0

UNNEST Funktion, brechen jede Zeile mit trennen Zeile, die eine beliebige Zeile enthält Es bedeutet, wir haben 12 Datensätze statt 4 Rekord, mit extra abgelegt "Name", es ist keine Lösung, in unserer Pivot-Tabelle haben wir Millionen von Rekord –

+0

Dank Clodoaldo, ich habe es versucht, als ich Gast .... also habe ich das arrays in sapparate of item geändert, dass ich sicher bin, dass sie eindeutig sind (wie "andy" => "an", "dy"), jetzt benutze ich array contain operand .... also durch diesen ansatz mein problem wurde verkauft ... meine Erfahrung ;-) –

0

Und noch eine andere Lösung unnest

select * from t1 
where exists (
    select * from unnest(t1.names) n 
    where n like 'a%')