WITH ORDINALITY Postgres 9.4 veya sonrasında
Yeni özellik, bu sınıftaki sorunları basitleştirir. Yukarıdaki sorgu şimdi olabilir:
SELECT *
FROM regexp_split_to_table('I think Postgres is nifty', ' ') WITH ORDINALITY x(word, rn);
Veya bir tabloya uygulanır:
SELECT *
FROM tbl t, regexp_split_to_table(t.my_column, ' ') WITH ORDINALITY x(word, rn);
Detaylar:
Örtülü LATERALbirleştirme hakkında:
Postgres 9.3 veya daha eski - ve daha genel açıklama
Tek bir dize için
row_number()Öğelerin sırasını hatırlamak için pencere işlevini uygulayabilirsiniz . Ancak, her zamanki ile row_number() OVER (ORDER BY col)size göre rakamları elde orijinal konuma değil, sıralama düzenine .
Sadece atlayabilirsiniz ORDER BY gibi" konumunu almayı :
SELECT *, row_number() OVER () AS rn
FROM regexp_split_to_table('I think Postgres is nifty', ' ') AS x(word);
Performansı regexp_split_to_table()Uzun telli bozunmaların . unnest(string_to_array(...))daha iyi ölçeklendirir:
SELECT *, row_number() OVER () AS rn
FROM unnest(string_to_array('I think Postgres is nifty', ' ')) AS x(word);
Ancak, bu süre normal olarak çalışır ve ben basit sorgularda kırılmış görmedim, Postgres açık bir satır olmadan sıra olarak hiçbir şey ileri sürüyor ORDER BY.
Orijinal dizedeki sıralı öğe sayısını garanti etmek için şunu kullanın:generate_subscript() (@deszo'nun yorumuyla geliştirildi):
SELECT arr[rn] AS word, rn
FROM (
SELECT *, generate_subscripts(arr, 1) AS rn
FROM string_to_array('I think Postgres is nifty', ' ') AS x(arr)
) y;
Bir dizgi tablosu için
Ekle PARTITION BY id için OVERfıkra ...
Demo tablosu:
CREATE TEMP TABLE strings(string text);
INSERT INTO strings VALUES
('I think Postgres is nifty')
,('And it keeps getting better');
Birincil anahtarctid için geçici yedek olarak kullanıyorum . Bir tane (veya benzersiz bir sütun ) varsa bunu kullanın.
SELECT *, row_number() OVER (PARTITION BY ctid) AS rn
FROM (
SELECT ctid, unnest(string_to_array(string, ' ')) AS word
FROM strings
) x;
Bu, farklı bir kimlik olmadan çalışır:
SELECT arr[rn] AS word, rn
FROM (
SELECT *, generate_subscripts(arr, 1) AS rn
FROM (
SELECT string_to_array(string, ' ') AS arr
FROM strings
) x
) y;
SQL Fiddle.
Sorunun cevabı
SELECT z.arr, z.rn, z.word, d.meaning -- , partofspeech -- ?
FROM (
SELECT *, arr[rn] AS word
FROM (
SELECT *, generate_subscripts(arr, 1) AS rn
FROM (
SELECT string_to_array(string, ' ') AS arr
FROM strings
) x
) y
) z
JOIN dictionary d ON d.wordname = z.word
ORDER BY z.arr, z.rn;