WITH ORDINALITY
Postgres में 9.4 या बाद में
नई सुविधा समस्याओं के इस वर्ग को सरल बनाती है। उपरोक्त क्वेरी अब बस हो सकती है:
SELECT *
FROM regexp_split_to_table('I think Postgres is nifty', ' ') WITH ORDINALITY x(word, rn);
या, एक मेज पर लागू:
SELECT *
FROM tbl t, regexp_split_to_table(t.my_column, ' ') WITH ORDINALITY x(word, rn);
विवरण:
निहित जुड़ाव के बारे में LATERAL
:
9.3 या पुराने पोस्टग्रेट्स - और अधिक सामान्य स्पष्टीकरण
एक तार के लिए
आप row_number()
तत्वों के क्रम को याद रखने के लिए विंडो फ़ंक्शन को लागू कर सकते हैं। हालांकि, सामान्य क्रमrow_number() OVER (ORDER BY col)
में आपको क्रमबद्ध क्रम के अनुसार नंबर मिलते हैं , न कि स्ट्रिंग में मूल स्थिति ।
आप बस ORDER BY
"जैसा है" स्थिति प्राप्त करने के लिए छोड़ सकते हैं :
SELECT *, row_number() OVER () AS rn
FROM regexp_split_to_table('I think Postgres is nifty', ' ') AS x(word);
regexp_split_to_table()
लंबे स्ट्रिंग्स के साथ गिरावट का प्रदर्शन । unnest(string_to_array(...))
तराजू बेहतर:
SELECT *, row_number() OVER () AS rn
FROM unnest(string_to_array('I think Postgres is nifty', ' ')) AS x(word);
हालाँकि, जबकि यह सामान्य रूप से काम करता है और मैंने इसे सरल प्रश्नों में कभी टूटते नहीं देखा, पंक्तियों को स्पष्ट किए बिना पंक्तियों के क्रम के रूप में कुछ भी नहीं बताता है ORDER BY
।
मूल स्ट्रिंग में तत्वों की क्रमिक संख्या की गारंटी देने के लिए , उपयोग करें generate_subscript()
(@deszo द्वारा टिप्पणी के साथ सुधार):
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;
तार की एक तालिका के लिए
जोड़े PARTITION BY id
को OVER
खंड ...
डेमो तालिका:
CREATE TEMP TABLE strings(string text);
INSERT INTO strings VALUES
('I think Postgres is nifty')
,('And it keeps getting better');
मैं ctid
एक प्राथमिक कुंजी के लिए तदर्थ विकल्प के रूप में उपयोग करता हूं । यदि आपके पास एक (या कोई अनूठा स्तंभ ) है, तो इसके बजाय उसका उपयोग करें।
SELECT *, row_number() OVER (PARTITION BY ctid) AS rn
FROM (
SELECT ctid, unnest(string_to_array(string, ' ')) AS word
FROM strings
) x;
यह बिना किसी अलग पहचान के काम करता है:
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;
एसक्यूएल फिडल।
सवाल का जवाब
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;