sql >> データベース >  >> RDS >> PostgreSQL

split_partを使用した後、空のフィールドに値を代入する

    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. Postgres on Rails致命的:データベースが存在しません

    2. SQLServerの統計の改善にご協力ください。

    3. where句を使用してMySQLデータを取得する

    4. Oracleselect相互サブ文字列