Обсуждение: Parse / print all elements of a json data column -

Поиск
Список
Период
Сортировка

Parse / print all elements of a json data column -

От
"S.Bob"
Дата:
All;


I've setup a logical replication slot in a 9.6 cluster.

I have pulled data with a query like this:

SELECT * FROM pg_logical_slot_get_changes('lr_cdc_slot', NULL, NULL, 
'pretty-print', '1')


I've even staged the returned 'data' column in a table like this:

create table json_test as select data::jsonb from 
pg_logical_slot_get_changes('lr_cdc_slot', null, 
null,'include-timestamp','1');


I want to isolate the various "fields" and "values" of the output json 
string (i.e. the table name, the operation, the columns, etc) However I 
am not having much luck.


Here's some of the queries that do work but none of them give me a full 
breakout of the fields:


select jsonb_each(data) from json_test ;

  (change,"[{""kind"": ""insert"", ""table"": ""lr_test_tab"", ""
schema"": ""lr_test_schema"", ""columnnames"": [""id"", ""compan
y_name"", ""status"", ""active_date""], ""columntypes"": [""inte
ger"", ""character varying(100)"", ""character varying(10)"", ""
timestamp with time zone""], ""columnvalues"": [1, ""Acme CO"",
""B+"", ""2017-12-12 10:14:39.899462-05""]}]")
  (timestamp,"""2019-12-12 10:14:39.901252-05""")
(2 rows)



select jsonb_object_keys(data::jsonb) from json_test ;
  jsonb_object_keys
-------------------
  change
  timestamp
(2 rows)



How can I pull each field and it's value from this (i.e kind = insert, 
table = lr_test_tab, columnnames = ...)?


Thanks in advance




Re: Parse / print all elements of a json data column -

От
Patrick
Дата:
On Thu, 12 Dec 2019 13:02:42 -0700
"S.Bob" <sbob@quadratum-braccas.com> wrote:

> All;
>
>
> I've setup a logical replication slot in a 9.6 cluster.
>
> I have pulled data with a query like this:
>
> SELECT * FROM pg_logical_slot_get_changes('lr_cdc_slot', NULL, NULL,
> 'pretty-print', '1')
>
>
> I've even staged the returned 'data' column in a table like this:
>
> create table json_test as select data::jsonb from
> pg_logical_slot_get_changes('lr_cdc_slot', null,
> null,'include-timestamp','1');
>
>
> I want to isolate the various "fields" and "values" of the output
> json string (i.e. the table name, the operation, the columns, etc)
> However I am not having much luck.
>
>
> Here's some of the queries that do work but none of them give me a
> full breakout of the fields:
>
>
> select jsonb_each(data) from json_test ;
>
>   (change,"[{""kind"": ""insert"", ""table"": ""lr_test_tab"", ""
> schema"": ""lr_test_schema"", ""columnnames"": [""id"", ""compan
> y_name"", ""status"", ""active_date""], ""columntypes"": [""inte
> ger"", ""character varying(100)"", ""character varying(10)"", ""
> timestamp with time zone""], ""columnvalues"": [1, ""Acme CO"",
> ""B+"", ""2017-12-12 10:14:39.899462-05""]}]")
>   (timestamp,"""2019-12-12 10:14:39.901252-05""")
> (2 rows)
>
>
>
> select jsonb_object_keys(data::jsonb) from json_test ;
>   jsonb_object_keys
> -------------------
>   change
>   timestamp
> (2 rows)
>
>
>
> How can I pull each field and it's value from this (i.e kind =
> insert, table = lr_test_tab, columnnames = ...)?
>
>
> Thanks in advance

Hi. are you by chance looking for something like this?:

$ cat get_jsonb.sql
CREATE TABLE json_test
(
   data  JSONB     NOT NULL
);

INSERT INTO json_test
(
   data
)
VALUES
(
   '{
        "change": [
            {
                "columnnames": [
                    "id",
                    "company_name",
                    "status",
                    "active_date"
                ],
                "columntypes": [
                    "integer",
                    "character varying(100)",
                    "character varying(10)",
                    "timestamp with time zone"
                ],
                "columnvalues": [
                    1,
                    "Acme CO",
                    "B+",
                    "2017-12-12 10:14:39.899462-05"
                ],
                "kind": "insert",
                "schema": "lr_test_schema",
                "table": "lr_test_tab"
            }
        ],
        "timestamp": "2019-12-12 10:14:39.901252-05"
    }'
);

-- SELECT jsonb_each(data)
-- FROM json_test;

-- SELECT jsonb_object_keys(data)
-- FROM json_test;

SELECT jsonb_each(data -> 'change' -> 0) AS the_key_value_pairs
FROM json_test
UNION ALL
SELECT row('timestamp', data -> 'timestamp')
FROM json_test;;

DROP TABLE json_test;


$ psql -U testy -h localhost -d postgres
Password for user testy:
psql (9.4.25)
Type "help" for help.

postgres=> SELECT version();
                                                    version
----------------------------------------------------------------------------------------------------------------
 PostgreSQL 9.4.25 on x86_64-unknown-linux-gnu, compiled by gcc (GCC)
4.8.5 20150623 (Red Hat 4.8.5-39), 64-bit (1 row)

postgres=> \i get_jsonb.sql
CREATE TABLE
INSERT 0 1
                                                the_key_value_pairs
--------------------------------------------------------------------------------------------------------------------
 (kind,"""insert""")
 (table,"""lr_test_tab""")
 (schema,"""lr_test_schema""")
 (columnnames,"[""id"", ""company_name"", ""status"", ""active_date""]")
 (columntypes,"[""integer"", ""character varying(100)"", ""character
varying(10)"", ""timestamp with time zone""]") (columnvalues,"[1,
""Acme CO"", ""B+"", ""2017-12-12 10:14:39.899462-05""]")
(timestamp,"""2019-12-12 10:14:39.901252-05""")
(7 rows)

DROP TABLE
\q


Probably not exactly what you are asking for, but it might be a step in
the right direction? CTEs or subqueries might be your friend here too.

Regards,
Patrick