अपने परीक्षण डेटा पर निर्माण, लेकिन यह मनमाने डेटा के साथ काम करता है। यह स्ट्रिंग में किसी भी संख्या में तत्वों के साथ काम करता है।
एक text
. से बना एक मिश्रित प्रकार पंजीकृत करें और एक integer
प्रति डेटाबेस एक बार मूल्य। मैं इसे ai
कहता हूं :
CREATE TYPE ai AS (a text, i int);
ट्रिक ai
. की एक सरणी बनाने की है कॉलम में प्रत्येक मान से।
regexp_matches()
पैटर्न के साथ (\D*)(\d*)
और g
विकल्प अक्षरों और संख्याओं के प्रत्येक संयोजन के लिए एक पंक्ति देता है। साथ ही दो खाली तारों वाली एक अप्रासंगिक लटकती पंक्ति '{"",""}'
इसे छानने या दबाने से सिर्फ लागत बढ़ेगी। खाली तारों को बदलने के बाद इसे एक सरणी में एकत्रित करें (''
) 0
. के साथ integer
. में घटक (''
. के रूप में integer
में नहीं डाला जा सकता )।
NULL
मान पहले क्रमबद्ध करें - या आपको उन्हें विशेष मामला बनाना होगा - या पूरे शेबैंग का उपयोग STRICT
में करें @Craig जैसा कार्य प्रस्तावित करता है।
9.4 या बाद के संस्करण पोस्ट करें
SELECT data
FROM alnum
ORDER BY ARRAY(SELECT ROW(x[1], CASE x[2] WHEN '' THEN '0' ELSE x[2] END)::ai
FROM regexp_matches(data, '(\D*)(\d*)', 'g') x)
, data;
db<>फिडल यहाँ
पोस्टग्रेज 9.1 (मूल उत्तर)
PostgreSQL 9.1.5 के साथ परीक्षण किया गया, जहां regexp_replace()
थोड़ा अलग व्यवहार था।
SELECT data
FROM (
SELECT ctid, data, regexp_matches(data, '(\D*)(\d*)', 'g') AS x
FROM alnum
) x
GROUP BY ctid, data -- ctid as stand-in for a missing pk
ORDER BY regexp_replace (left(data, 1), '[0-9]', '0')
, array_agg(ROW(x[1], CASE x[2] WHEN '' THEN '0' ELSE x[2] END)::ai)
, data -- for special case of trailing 0
जोड़ें regexp_replace (left(data, 1), '[1-9]', '0')
पहले के रूप में ORDER BY
प्रमुख अंकों और खाली तारों का ध्यान रखने के लिए आइटम।
<स्ट्राइक>यदि विशेष वर्ण जैसे {}()"',
हो सकता है, आपको तदनुसार उनसे बचना होगा।
@ क्रेग का ROW
का उपयोग करने का सुझाव अभिव्यक्ति इसका ख्याल रखती है।
<स्ट्राइक>बीटीडब्ल्यू, यह sqlfiddle में निष्पादित नहीं होगा, लेकिन यह मेरे डीबी क्लस्टर में करता है। JDBC इसके ऊपर नहीं है। sqlfiddle शिकायत करता है:स्ट्राइक>
<ब्लॉकक्वॉट>विधि org.postgresql.jdbc3.Jdbc3Array.getArrayImpl(long,int,Map) अभी तक लागू नहीं किया गया है।
तब से इसे ठीक कर दिया गया है:http://sqlfiddle.com/#!17/fad6e/1