2015-05-18 13 views
7

to jest dane Próbuję zapytania: Nazwa tabeli: „Test”, w kolumnie „dane”zapytań SQL trzeba tekst tablica [] na określony element

7;"{{Hello,50},{Wazaa,90}}" 
8;"{{Hello,50},{"Dobar Den",15}}" 

zapytanie do tej DANYCH używam tej kwerendy SQL:

SELECT *, pg_column_size(data) FROM test WHERE data[1][1] = 'Hello' 

Jak mogę przeszukiwać wszystkich elementów, ale w akapicie pierwszym elementem, a nie w drugiej, na przykład:

SELECT *, pg_column_size(data) FROM test WHERE data[][1] = 'Hello' 

ponieważ jeśli mogę szukać tak:

SELECT *, pg_column_size(data) FROM test WHERE data[1][1] = "Wazaa" 

to niczego nie wrócić, bo jestem hardcoding patrzeć na pierwszym elemencie sub i muszę go zmodyfikować tak:

SELECT *, pg_column_size(data) FROM test WHERE data[2][1] = 'Wazaa' 

Jak aby sprawdziła wszystkie elementy nadrzędne i pierwszy podelement?

istnieje rozwiązanie wykorzystujące "KAŻDY" do odpytywania o wszystkie elementy, ale nie chcę dotykać drugiego elementu w instrukcji gdzie, ponieważ jeśli mam numery w pierwszym podelementie, zapytanie o drugi parametr, który również jest liczbą.

+1

Ponieważ zasadniczo przechowujesz pary klucz/wartość, byłoby o wiele bardziej wydajne użycie do tego kolumny "hstore". –

+0

Myślę, że lepiej z hstore. –

Odpowiedz

1

Obsługa PostgreSQL dla tablic nie jest szczególnie dobra. Możesz unnest wystarczająco prostą tablicę jednowymiarową, ale tablica n-wymiarowa jest całkowicie spłaszczona, a nie tylko pierwszy. Mimo to, można użyć tej metody, aby znaleźć żądany zestaw rekordów, ale jest to raczej brzydki:

SELECT test.*, pg_column_size(test.data) AS column_size 
FROM test 
JOIN (SELECT id, unnest(data) AS strings FROM test) AS id_strings USING (id) 
WHERE id_strings.strings = 'Wazaa'; 

Ewentualnie napisać this function do zmniejszenia 2-wymiarową tablicę do ewidencji tablic 1-wymiarowych i następnie można w zasadzie używaj wszystkich zapytań SQL w twoim pytaniu.

+0

Która baza jest lepsza dla tablic? –

+2

Większość baz danych, jakie znamy dzisiaj, jest [relacyjna] (https://en.wikipedia.org/wiki/Relational_model). To sprawia, że ​​z natury są źle dopasowane do sekwencyjnych struktur danych, takich jak tablice. Ogólnie zaleca się zmianę modelu danych w taki sposób, aby na początku nie trzeba było tablic. – Patrick

+2

@Patrick: właściwie myślę, że w świecie relacyjnych baz danych obsługa tablic PostgreS jest bardzo dobra - żaden inny DBMS, który znam, nie oferuje tego rodzaju elastyczności. Jak w przypadku każdej funkcji: zawsze możesz to poprawić. To, czy tablica jest dobrym wyborem dla konkretnego problemu, to jednak zupełnie inny temat. –

Powiązane problemy