PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

PostgreSQL denescape 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Валидиране на уникалност в база данни, когато валидирането има условие за друга таблица

  2. Как Sind() работи в PostgreSQL

  3. ruby postgreSQL на AMD64

  4. Вземете стойност на полето от запис, който кара агрегатно условие да бъде вярно

  5. вземете последните три месеца записи от таблицата