PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Chaîne JSON sans échappement PostgreSQL

Je viens de rencontrer ce problème moi-même, et voici comment je l'ai abordé. J'ai créé une fonction d'assistance qui itère sur le tableau et utilise l'opérateur ->> en utilisant un indice pour récupérer la valeur du texte. Si quelqu'un connaît un meilleur moyen, je suis heureux d'en entendre parler, car cela semble un peu maladroit.

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;

Ensuite, vous pouvez faire des choses comme :

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)

Vous pouvez également faire en sorte que la fonction renvoie simplement un ensemble de texte si vous ne voulez pas traiter directement les tableaux :

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;

Et puis faites ceci :

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)