sql >> Databáze >  >> RDS >> PostgreSQL

PostgreSQL zruší kódování řetězce JSON

Sám jsem na tento problém narazil a zde je návod, jak jsem k němu přistoupil. Vytvořil jsem pomocnou funkci, která iteruje pole a používá operátor ->> pomocí dolního indexu k získání textové hodnoty zpět. Pokud někdo zná lepší způsob, rád se o něm dozvím, protože to vypadá trochu neohrabaně.

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;

Pak můžete dělat věci jako:

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)

Můžete také nastavit, aby funkce pouze vracela sadu textu, pokud se nechcete zabývat poli přímo:

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 pak udělejte toto:

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. mysql WHERE IN řetězec pole / uživatelské jméno

  2. Obnovení databáze ze souborů .mdf a .ldf SQL Server 2008

  3. SQL Náhodné řádky ve velké tabulce (s klauzulí where)

  4. Postgres SQL pro dotaz na text pole[] v konkrétním prvku