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

PostgreSQLのエスケープ解除JSON文字列

    私は自分でこの問題に遭遇しました、そしてこれが私がそれにアプローチした方法です。配列を反復処理し、添え字を使用して->>演算子を使用してテキスト値を取得するヘルパー関数を作成しました。誰かがもっと良い方法を知っているなら、これは少し扱いに​​くいように見えるので、私はそれについて聞いてうれしいです。

    CREATE OR REPLACE FUNCTION json_text_array_to_pg_text_array(data json) returns text[] AS $$
    DECLARE
        i integer;
        agg text[];
    BEGIN
        FOR i IN 0..json_array_length(data)-1 LOOP
            agg := array_append(agg, data->>i);
        END LOOP;
    
        return agg;
    END
    $$ language plpgsql;
    

    次に、次のようなことができます。

    test=# select json_text_array_to_pg_text_array('[ "hello","the\"re","i''m", "an", "array" ]'::json);
     json_text_array_to_pg_text_array 
    ----------------------------------
     {hello,"the\"re",i'm,an,array}
    (1 row)
    

    配列を直接処理したくない場合は、関数に一連のテキストを返すようにすることもできます。

    CREATE OR REPLACE FUNCTION json_text_array_to_row(data json) returns setof text AS $$
    DECLARE
        i integer;
    BEGIN
        FOR i IN 0..json_array_length(data)-1 LOOP
            return next data->>i;
        END LOOP;
        return;
    END
    $$ language plpgsql;
    

    そして、これを行います:

    test=# select json_text_array_to_row('{"single_comment": "Fred said \"Hi.\"" ,"comments_array": ["Fred said \"Hi.\"", "Fred said \"Hi.\"", "Fred said \"Hi.\""]}'::json->'comments_array');
     json_text_array_to_row 
    ------------------------
     Fred said "Hi."
     Fred said "Hi."
     Fred said "Hi."
    (3 rows)
    


    1. 2つの日付フィールド間の日付のmysqlクエリ

    2. データベースをAmazonVPCに接続する方法

    3. 2つの結合されたテーブルから合計を選択します

    4. 1億件のレコードを検索するためのパフォーマンス