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

2つの区切り文字で文字列を分割し、タイプを変換します

    中間ステップが必要な場合:

    SELECT unnest(string_to_array(a, ' '))::float8
           -- or do something else with the derived table
    FROM   unnest(string_to_array('3.584731 60.739211,3.590472 60.738030', ',')) a;
    

    これは、regexp_split_to_table() 、ただし、正規表現は通常より高価であるため、それでも高速になる可能性があります。 (EXPLAIN ANALYZEでテスト 。)

    最初に','で分割しました 、次は' ' -あなたが説明することの逆の順序がより適切であるように思われます。

    必要に応じて、これをPL/pgSQL関数にラップできます。

    CREATE OR REPLACE FUNCTION public.split_string(_str text
                                                 , _delim1 text = ','
                                                 , _delim2 text = ' ')
      RETURNS SETOF float8 AS
    $func$
    BEGIN
       RETURN QUERY
       SELECT unnest(string_to_array(a, _delim2))::float8
              -- or do something else with the derived table from step 1
       FROM   unnest(string_to_array(_str, _delim1)) a;
    END
    $func$ LANGUAGE plpgsql IMMUTABLE;
    

    または単にSQL関数:

    CREATE OR REPLACE FUNCTION public.split_string(_str text
                                                 , _delim1 text = ','
                                                 , _delim2 text = ' ')
      RETURNS SETOF float8 AS
    $func$
       SELECT unnest(string_to_array(a, _delim2))::float8
       FROM   unnest(string_to_array(_str, _delim1)) a
    $func$ LANGUAGE sql IMMUTABLE;
    

    IMMUTABLEにします パフォーマンスの最適化やその他の用途を可能にするため。

    呼び出し(_delim1に提供されているデフォルトを使用) および_delim2 ):

    SELECT * FROM split_string('3.584731 60.739211,3.590472 60.738030');
    

    または:

    SELECT * FROM split_string('3.584731 60.739211,3.590472 60.738030', ',', ' ');
    

    最速

    最高のパフォーマンスを得るには、translate() unnest(string_to_array(...))を使用 :

    SELECT unnest(
              string_to_array(
                 translate('3.584731 60.739211,3.590472 60.738030', ' ', ',')
               , ','
              )
           )::float8
    


    1. Typeorm / Typescriptでリクエストタイムアウトを追加するにはどうすればよいですか?

    2. 公式イメージの上にカスタムSQLServerDockerイメージを作成する

    3. mysqlでネストされたセットを処理しますか?

    4. pl/sqlを使用してバッチ操作を行う方法