2013-07-10 13 views
5

Ho una ricerca array in cappello Postgres corrisponde almeno un tag come questo:Postgres Array prefisso corrispondenza

SELECT * FROM users WHERE tags && ['fun']; 

| id | tags  | 
| 1 | [fun,day] | 
| 2 | [fun,sun] | 

E 'possibile abbinare il prefissi? Qualcosa di simile:

SELECT * FROM users WHERE tags LIKE 'f%'; 

| id | tags  | 
| 1 | [fun,day] | 
| 2 | [fun,sun] | 
| 3 | [far]  | 
| 4 | [fin]  | 

risposta

4

provare questo

create table users (id serial primary key, tags text[]); 

insert into users (tags) 
values 
    ('{"fun", "day"}'), 
    ('{"fun", "sun"}'), 
    ('{"test"}'), 
    ('{"fin"}'); 

select * 
from users 
where exists (select * from unnest(tags) as arr where arr like 'f%') 

SQL FIDDLE EXAMPLE

+0

che esiste clausola non è corretto - guardare i risultati. Manca un riferimento alla query esterna per associare le righe. Prova ad aggiungere AND 'id = u.id' (è" u "è l'alias per la tabella esterna). Fiddle aggiornato: http://sqlfiddle.com/#!12/a6940/10/0 – bma

+0

Non ho molta esperienza in PostgreSQL (principalmente in SQL server), ma sono abbastanza sicuro di sbagliarvi e BTW la mia query restituisce il risultato corretto in sqlfiddle. Exists sta già lavorando ai tag di riga correnti, quindi id = u.id. SQLFIDDLE è inattivo al momento, quindi lo controllerò più tardi. –

+1

in pratica la mia query potrebbe essere riscritta come 'select * dagli utenti come tu esiste (seleziona * da unnest (u.tags) come arr dove arr come 'f%')' –

3

Ecco un esempio funzionante che dovrebbe farti più o meno quello che stai cercando. Si noti che non sto affermando che questo approccio scalare ...

create table users (
id  serial primary key, 
tags text[] not null 
); 

insert into users (tags) values 
('{"aaaa","bbbb","cccc"}'::text[]), 
('{"badc","dddd","eeee"}'::text[]), 
('{"gggg","ffbb","attt"}'::text[]); 

select * 
from (select id,unnest(tags) arr from users) u 
where u.arr like 'a%'; 

id | arr 
----+------ 
    1 | aaaa 
    3 | attt 
Problemi correlati