Biorąc pod uwagę ciąg:
„Myślę, że PostgreSQL jest fajny”
Chciałbym operować poszczególnymi słowami znajdującymi się w tym ciągu. Zasadniczo mam osobny element, z którego mogę uzyskać szczegółowe informacje na temat słów i chciałbym dołączyć do nie odkrytej tablicy tego łańcucha w tym słowniku.
Do tej pory mam:
select word, meaning, partofspeech
from unnest(string_to_array('I think that PostgreSQL is nifty',' ')) as word
from table t
join dictionary d
on t.word = d.wordname;
Osiąga to podstawy tego, co miałem nadzieję zrobić, ale nie zachowuje oryginalnej kolejności słów.
Powiązane pytanie:
PostgreSQL unnest () z numerem elementu
postgresql
sorting
array
parse
swasheck
źródło
źródło
Odpowiedzi:
WITH ORDINALITY
w Postgres 9.4 lub nowszymNowa funkcja upraszcza tę klasę problemów. Powyższe zapytanie może teraz być po prostu:
Lub zastosowane do tabeli:
Detale:
Informacje o niejawnym
LATERAL
połączeniu:Postgres 9.3 lub starszy - i bardziej ogólne wyjaśnienie
Dla pojedynczego ciągu
Możesz zastosować funkcję okna,
row_number()
aby zapamiętać kolejność elementów. Jednak w zwykłym przypadkurow_number() OVER (ORDER BY col)
otrzymujesz liczby zgodnie z kolejnością sortowania , a nie pierwotną pozycję w ciągu.Możesz po prostu pominąć,
ORDER BY
aby uzyskać pozycję „jak jest”:Wydajność
regexp_split_to_table()
degradacji z długimi łańcuchami.unnest(string_to_array(...))
skaluje się lepiej:Jednak, chociaż normalnie działa to i nigdy nie widziałem, aby łamał się w prostych zapytaniach, Postgres nie zapewnia niczego o kolejności wierszy bez wyraźnego
ORDER BY
.Aby zagwarantować liczbę porządkową elementów w oryginalnym łańcuchu, użyj
generate_subscript()
(poprawione komentarzem @deszo):Dla tabeli ciągów znaków
Dodaj
PARTITION BY id
doOVER
klauzuli ...Tabela demo:
Używam
ctid
jako ad-hoc zamiennika klucza podstawowego . Jeśli masz jedną (lub dowolną unikalną kolumnę ), użyj jej zamiast tego.To działa bez wyraźnego ID:
SQL Fiddle.
Odpowiedz na pytanie
źródło
SELECT generate_series(1,array_length(word_array,1)), unnest(word_array) FROM ....
. 9.3LATERAL
może zapewnić lepsze rozwiązania tego problemu.generate_subscripts(arr, 1)
działałby zamiastgenerate_series(1, array_upper(arr, 1))
? Wolę tę pierwszą dla jasności.