sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL unescape JSON-tekenreeks

Ik kwam dit probleem zelf net tegen, en hier is hoe ik het heb aangepakt. Ik heb een helperfunctie gemaakt die de array herhaalt en de ->> operator gebruikt met een subscript om de tekstwaarde terug te krijgen. Als iemand een betere manier weet, hoor ik het graag, want dit lijkt een beetje onhandig.

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;

Dan kun je dingen doen als:

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)

Je kunt de functie ook gewoon een set tekst laten retourneren als je niet direct met de arrays wilt omgaan:

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;

En doe dan dit:

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. Waarom werken CROSS JOIN-voorwaarden niet in de 'ON'-clausule, alleen in de WHERE-clausule?

  2. Ik vind geen fout. Deze code doet het goed. Werk mijn gegevens perfect bij. Maar er wordt 1 fout weergegeven

  3. MYSQL en RDBMS

  4. Een string invoegen in een andere string in SQL Server met STUFF()