split_part() ('') - not 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')
, (10, '10-111')
, (11, '11-1')
, (11, '11-0')
, (11, '11-')
, (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;
.
Or a more explicit statement CASE:
CASE WHEN split_part(version, '-', 2) = '' THEN '0' ELSE split_part(version, '-', 2) END
dbfiddle here
on this topic: