PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

PostgreSQL unescape string JSON

Sam natknąłem się na ten problem i oto jak do niego podszedłem. Stworzyłem funkcję pomocniczą, która iteruje po tablicy i używa operatora ->> za pomocą indeksu dolnego, aby odzyskać wartość tekstową. Jeśli ktoś zna lepszy sposób, cieszę się, że o tym słyszę, ponieważ wydaje się to trochę niezręczne.

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;

Następnie możesz robić takie rzeczy jak:

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)

Możesz również sprawić, że funkcja po prostu zwróci zestaw tekstu, jeśli nie chcesz bezpośrednio zajmować się tablicami:

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;

A potem zrób to:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zwróć wiersze, które mają maksymalnie jedną kolumnę w Postgresql

  2. Jak mogę przyspieszyć różnicę między tabelami?

  3. Postgres json_agg zawiera nagłówek kolumny — Nieprawidłowy JSON?

  4. psycopg2 nie może znaleźć żadnych tabel po połączeniu

  5. Jaki powinien być typ parametru w Javie, gdy jest to znacznik czasu bez strefy czasowej w postgresql?