2013-07-10 17 views
5

Mam tablicę wyszukiwania w PostgreSQL kapelusz pasuje przynajmniej jeden tag jak to:Postgres Array Prefiks Dopasowane

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

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

To jest możliwe, aby dopasować na prefiksów? Coś jak:

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

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

Odpowiedz

4

spróbować

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

który istnieje zapis jest niepoprawny - spojrzeć na wyniki. Brakuje odniesienia do zewnętrznego zapytania, aby powiązać wiersze. Spróbuj dodać AND 'id = u.id' ("u" jest aliasem dla zewnętrznej tabeli). Zaktualizowano Fiddle: http://sqlfiddle.com/#!12/a6940/10/0 – bma

+0

Nie mam zbyt wiele doświadczenia w PostgreSQL (głównie na serwerze SQL), ale jestem prawie pewien, że się mylisz i BTW moje zapytanie zwraca poprawny wynik w sqlfiddle. Exists działa już na bieżących znacznikach wierszy, więc twój id = u.id. SQLFIDDLE nie działa w tej chwili, więc sprawdzę to później. –

+1

zasadniczo moje zapytanie może być przepisane jako 'wybierz * od użytkowników jako u, gdzie istnieje (wybierz * z unnest (u.tags) jako arr, gdzie arr jak" f% ")' –

3

Oto przykład pracy, który powinien dać ci mniej więcej to, czego szukasz. Zauważ, że nie twierdzę, że takie podejście będzie skalować ...

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