Diberikan string:
'Saya pikir PostgreSQL bagus'
Saya ingin beroperasi pada kata-kata individual yang ditemukan dalam string itu. Pada dasarnya, saya memiliki yang terpisah dari mana saya bisa mendapatkan rincian kata dan ingin bergabung dengan array string yang tidak diuji pada kamus ini.
Sejauh ini saya punya:
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;
Ini mencapai dasar-dasar dari apa yang saya harapkan untuk dilakukan, tetapi itu tidak mempertahankan urutan kata aslinya.
Pertanyaan terkait:
PostgreSQL undest () dengan nomor elemen
postgresql
sorting
array
parse
swasheck
sumber
sumber
Jawaban:
WITH ORDINALITY
dalam Postgres 9.4 atau lebih baruFitur baru menyederhanakan kelas masalah ini. Kueri di atas sekarang dapat berupa:
Atau, diterapkan pada tabel:
Detail:
Tentang
LATERAL
gabung implisit :Postgres 9.3 atau lebih tinggi - dan penjelasan yang lebih umum
Untuk satu string
Anda dapat menerapkan fungsi jendela
row_number()
untuk mengingat urutan elemen. Namun, dengan biasarow_number() OVER (ORDER BY col)
Anda mendapatkan angka sesuai urutan , bukan posisi awal dalam string.Anda bisa dengan mudah menghilangkan
ORDER BY
untuk mendapatkan posisi "apa adanya":Performa
regexp_split_to_table()
menurunkan dengan string panjang.unnest(string_to_array(...))
skala lebih baik:Namun, sementara ini biasanya bekerja dan saya belum pernah melihatnya memecah dalam pertanyaan sederhana, Postgres tidak menegaskan apa pun tentang urutan baris tanpa eksplisit
ORDER BY
.Untuk menjamin jumlah elemen dalam string asli, gunakan
generate_subscript()
(ditingkatkan dengan komentar oleh @deszo):Untuk daftar string
Tambahkan
PARTITION BY id
keOVER
klausa ...Tabel demo:
Saya menggunakan
ctid
sebagai pengganti ad-hoc untuk kunci utama . Jika Anda memiliki satu (atau kolom unik ) gunakan saja.Ini berfungsi tanpa ID berbeda:
SQL Fiddle.
Jawab pertanyaan
sumber
SELECT generate_series(1,array_length(word_array,1)), unnest(word_array) FROM ....
. 9.3LATERAL
dapat memberikan solusi yang lebih baik untuk masalah ini.generate_subscripts(arr, 1)
berhasilgenerate_series(1, array_upper(arr, 1))
? Saya lebih suka yang pertama untuk kejelasan.