PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

मिश्रित शब्द-और-संख्या स्ट्रिंग्स की मानवकृत या प्राकृतिक संख्या छँटाई

अपने परीक्षण डेटा पर निर्माण, लेकिन यह मनमाने डेटा के साथ काम करता है। यह स्ट्रिंग में किसी भी संख्या में तत्वों के साथ काम करता है।

एक 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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL 8.3 के बाद से TPC-H का प्रदर्शन

  2. PostgreSQL द्वारा पेश किया गया JSONB की व्याख्या

  3. Django के साथ PostgreSQL स्कीमा / नेमस्पेस

  4. कैसे date_trunc () PostgreSQL में काम करता है

  5. डॉकटर में होस्ट के लिए लोकलहोस्ट और पोस्टग्रेज के बीच अंतर