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文字列を数値として注文する>
- 最初に選択各GROUPBYグループの行?
- PostgreSQLを日時で並べ替えるasc、最初にnull?
- 方法PostgreSQLで空をnullに変換しますか?