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

स्प्लिट_पार्ट का उपयोग करने के बाद खाली क्षेत्र में मूल्य का प्रतिस्थापन

split_part() खाली स्ट्रिंग लौटाता है ('' ) - नहीं NULL - जब लौटाया जाने वाला हिस्सा खाली हो या न के बराबर हो। इसीलिए COALESCE कुछ नहीं करता है यहां। और खाली स्ट्रिंग ('' ) का integer . के रूप में कोई प्रतिनिधित्व नहीं है मान है, इसलिए इसे डालने का प्रयास करते समय यह एक त्रुटि देता है।

इस उदाहरण में सबसे छोटा तरीका होना चाहिए <मजबूत>GREATEST(split_part( ... ) , '0') कास्टिंग से पहले, चूंकि खाली स्ट्रिंग किसी अन्य गैर-रिक्त स्ट्रिंग या यहां तक ​​​​कि NULL (किसी भी लोकेल में) से पहले छा जाती है। फिर DISTINCT ON () . का उपयोग करें "सबसे बड़ी" version . के साथ पंक्ति प्राप्त करने के लिए प्रत्येक id . के लिए ।

परीक्षण सेटअप

CREATE TABLE tbl (
   id      integer NOT NULL
 , version text    NOT NULL
);

INSERT INTO tbl VALUES
     (10, '10-2')
   , (10, '10-1')
   , (10, '10')      -- missing subversion
   , (10, '10-111')  -- multi-digit number
   , (11, '11-1')
   , (11, '11-0')    -- proper '0'
   , (11, '11-')     -- missing subversion but trailing '-'
   , (11, '11-2');

समाधान

SELECT DISTINCT ON (id) *
FROM   tbl
ORDER  BY id, GREATEST(split_part(version, '-', 2), '0')::int DESC;

परिणाम:

 id | version 
----+---------
 10 | 10-111
 11 | 10-2

या आप कर सकते थे NULLIF . का भी उपयोग करें और NULLS LAST . का उपयोग करें (अवरोही क्रम में) क्रमबद्ध करने के लिए:

SELECT DISTINCT ON (id) *
FROM   tbl
ORDER  BY id, NULLIF(split_part(version, '-', 2), '')::int DESC NULLS LAST;

वही परिणाम।

या अधिक स्पष्ट CASE कथन:

CASE WHEN split_part(version, '-', 2) = '' THEN '0' ELSE split_part(version, '-', 2) END

dbfiddle यहां

संबंधित:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. pg_column_size octet_length से छोटा कैसे हो सकता है?

  2. मैं Django ArrayField की लंबाई कैसे पूछूं?

  3. क्या SQLAlchemy में bool_and कुल कार्य है?

  4. PostgreSQL 11 को PostgreSQL 13 में TimescaleDB और Linux में PostGIS के साथ pg_upgrad का उपयोग करके अपग्रेड करना

  5. प्रत्येक क्लाइंट के लिए सेपरेट पोस्टग्रेएसक्यूएल डीबी, सिंगल Django ऐप और एक ही सर्वर पर क्लाइंट बनाने पर स्वचालित माइग्रेशन के साथ