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 यहां
संबंधित:
- varchar string को संख्यात्मक के रूप में ऑर्डर करें
- पहले चुनें प्रत्येक ग्रुप बाय ग्रुप में पंक्ति?
- PostgreSQL डेटाटाइम के अनुसार सॉर्ट करें asc, पहले शून्य?
- कैसे करें PostgreSQL में खाली को शून्य में बदलें?