Delete values from JSON

Started by Andreas Joseph Kroghabout 3 years ago5 messagesgeneral
Jump to latest
#1Andreas Joseph Krogh
andreas@visena.com

Hi, in PG-14, how do I delete the keys "dunsNumber": "NaN":

{ "sessionId": "ce6fc9d0-5923-4d71-9f7e-ae60f35c45d6", "details": [ {
"keyInformation": { "dunsNumber": "NaN", "organizationType": "LIMITED_COMPANY"
} }, { "keyInformation": { "dunsNumber": "123", "organizationType":
"LIMITED_COMPANY" } } ], "nisse": 123 }

So that the result becomes:

{ "sessionId": "ce6fc9d0-5923-4d71-9f7e-ae60f35c45d6", "details": [ {
"keyInformation": { "organizationType": "LIMITED_COMPANY" } }, {
"keyInformation": { "dunsNumber": "123", "organizationType": "LIMITED_COMPANY"
} } ], "nisse": 123 }

Thanks.

--
Andreas Joseph Krogh
CTO / Partner - Visena AS
Mobile: +47 909 56 963
andreas@visena.com <mailto:andreas@visena.com>
www.visena.com <https://www.visena.com&gt;
<https://www.visena.com&gt;

#2Romain MAZIÈRE
romain.maziere@sigmaz-consilium.fr
In reply to: Andreas Joseph Krogh (#1)
Re: Delete values from JSON

Hi,

If it is jsonb type, you can have a look at the documentation :
https://www.postgresql.org/docs/14/functions-json.html

There are some examples :

|jsonb| |-| |text| → |jsonb|

Deletes a key (and its value) from a JSON object, or matching string
value(s) from a JSON array.

|'{"a": "b", "c": "d"}'::jsonb - 'a'| → |{"c": "d"}|

|'["a", "b", "c", "b"]'::jsonb - 'b'| → |["a", "c"]|

|jsonb| |-| |text[]| → |jsonb|

Deletes all matching keys or array elements from the left operand.

|'{"a": "b", "c": "d"}'::jsonb - '{a,c}'::text[]| → |{}|

|jsonb| |-| |integer| → |jsonb|

Deletes the array element with specified index (negative integers count
from the end). Throws an error if JSON value is not an array.

|'["a", "b"]'::jsonb - 1| → |["a"]|

|jsonb| |#-| |text[]| → |jsonb|

Deletes the field or array element at the specified path, where path
elements can be either field keys or array indexes.

|'["a", {"b":1}]'::jsonb #- '{1,b}'| → |["a", {}]|

Regards

Romain MAZIÈRE
romain.maziere@sigmaz-consilium.fr
+33.535.545.085
+33.781.46.36.96
https://sigmaz-consilium.fr

Le 17/03/2023 à 08:56, Andreas Joseph Krogh a écrit :

Show quoted text

Hi, in PG-14, how do I delete the keys |"dunsNumber": "NaN"|:

|{ "sessionId": "ce6fc9d0-5923-4d71-9f7e-ae60f35c45d6", "details": [ {
"keyInformation": { "dunsNumber": "NaN", "organizationType":
"LIMITED_COMPANY" } }, { "keyInformation": { "dunsNumber": "123",
"organizationType": "LIMITED_COMPANY" } } ], "nisse": 123 }|

So that the result becomes:

|{ "sessionId": "ce6fc9d0-5923-4d71-9f7e-ae60f35c45d6", "details": [ {
"keyInformation": { "organizationType": "LIMITED_COMPANY" } }, {
"keyInformation": { "dunsNumber": "123", "organizationType":
"LIMITED_COMPANY" } } ], "nisse": 123 }|

Thanks.

--
*Andreas Joseph Krogh*
CTO / Partner - Visena AS
Mobile: +47 909 56 963
andreas@visena.com
www.visena.com <https://www.visena.com&gt;
<https://www.visena.com&gt;

Attachments:

pTf753EUtNRv0MU6.pngimage/png; name=pTf753EUtNRv0MU6.pngDownload
OpenPGP_0x97C05C89DEC4129F.ascapplication/pgp-keys; name=OpenPGP_0x97C05C89DEC4129F.ascDownload
#3Andreas Joseph Krogh
andreas@visena.com
In reply to: Romain MAZIÈRE (#2)
Re: Delete values from JSON

På fredag 17. mars 2023 kl. 11:56:22, skrev Romain MAZIÈRE <
romain.maziere@sigmaz-consilium.fr <mailto:romain.maziere@sigmaz-consilium.fr>>:
Hi,

If it is jsonb type, you can have a look at the documentation :
https://www.postgresql.org/docs/14/functions-json.html
<https://www.postgresql.org/docs/14/functions-json.html&gt;

There are some examples :

jsonb - text → jsonb

Deletes a key (and its value) from a JSON object, or matching string value(s)
from a JSON array.

'{"a": "b", "c": "d"}'::jsonb - 'a' → {"c": "d"}

'["a", "b", "c", "b"]'::jsonb - 'b' → ["a", "c"]

jsonb - text[] → jsonb

Deletes all matching keys or array elements from the left operand.

'{"a": "b", "c": "d"}'::jsonb - '{a,c}'::text[] → {}

jsonb - integer → jsonb

Deletes the array element with specified index (negative integers count from
the end). Throws an error if JSON value is not an array.

'["a", "b"]'::jsonb - 1 → ["a"]

jsonb #- text[] → jsonb

Deletes the field or array element at the specified path, where path elements
can be either field keys or array indexes.

'["a", {"b":1}]'::jsonb #- '{1,b}' → ["a", {}]

Regards

I have looked at the docs, but it doesn't, AFAIU, show how to conditionally
delete a key based on its value, and leave other keys in the JSONB not matching
the value alone.

I want to delete all keys in the (pseudo) path
details.keyInformation[*].dunsNumber if the value is "NaN".

--
Andreas Joseph Krogh
CTO / Partner - Visena AS
Mobile: +47 909 56 963
andreas@visena.com <mailto:andreas@visena.com>
www.visena.com <https://www.visena.com&gt;
<https://www.visena.com&gt;

#4Boris Zentner
bzm@2bz.de
In reply to: Andreas Joseph Krogh (#1)
Re: Delete values from JSON

Am 17.03.2023 um 08:56 schrieb Andreas Joseph Krogh <andreas@visena.com>:

Hi, in PG-14, how do I delete the keys "dunsNumber": "NaN":

{
"sessionId": "ce6fc9d0-5923-4d71-9f7e-ae60f35c45d6",
"details": [
{
"keyInformation": {
"dunsNumber": "NaN",
"organizationType": "LIMITED_COMPANY"
}
},
{
"keyInformation": {
"dunsNumber": "123",
"organizationType": "LIMITED_COMPANY"
}
}
],
"nisse": 123
}

So that the result becomes:

{
"sessionId": "ce6fc9d0-5923-4d71-9f7e-ae60f35c45d6",
"details": [
{
"keyInformation": {
"organizationType": "LIMITED_COMPANY"
}
},
{
"keyInformation": {
"dunsNumber": "123",
"organizationType": "LIMITED_COMPANY"
}
}
],
"nisse": 123
}

Thanks.

Hi Andreas, this works for me.

➤ 2023-03-18 14:23:51 CET bz@[local]:5432/test
=# WITH data(j)
AS (VALUES (CAST('{ "sessionId": "ce6fc9d0-5923-4d71-9f7e-ae60f35c45d6", "details": [ { "keyInformation": { "dunsNumber": "NaN", "organizationType": "LIMITED_COMPANY" } }, { "keyInformation": { "dunsNumber": "123", "organizationType": "LIMITED_COMPANY" } } ], "nisse": 123 }' AS jsonb)))

SELECT jsonb_pretty(jsonb_set(j
, '{details}'
, (SELECT jsonb_agg(CASE
WHEN ((elem -> 'keyInformation') ->> 'dunsNumber') = 'NaN'
THEN jsonb_set(elem
, '{keyInformation}'
, (elem -> 'keyInformation') - 'dunsNumber')
ELSE elem
END)
FROM jsonb_array_elements(data.j -> 'details') AS elem))) AS nice_output
FROM data
;
nice_output
{
"nisse": 123,
"details": [
{
"keyInformation": {
"organizationType": "LIMITED_COMPANY"
}
},
{
"keyInformation": {
"dunsNumber": "123",
"organizationType": "LIMITED_COMPANY"
}
}
],
"sessionId": "ce6fc9d0-5923-4d71-9f7e-ae60f35c45d6"
}
(1 row)
Time: 0,731 ms

--
Boris

#5Andreas Joseph Krogh
andreas@visena.com
In reply to: Boris Zentner (#4)
Re: Delete values from JSON

Excellent!
Thanks!

På lørdag 18. mars 2023 kl. 14:26:57, skrev Boris Zentner <bzm@2bz.de
<mailto:bzm@2bz.de>>:

Am 17.03.2023 um 08:56 schrieb Andreas Joseph Krogh <andreas@visena.com>:

Hi, in PG-14, how do I delete the keys "dunsNumber": "NaN":

{ "sessionId": "ce6fc9d0-5923-4d71-9f7e-ae60f35c45d6", "details": [ {
"keyInformation": { "dunsNumber": "NaN", "organizationType": "LIMITED_COMPANY"
} }, { "keyInformation": { "dunsNumber": "123", "organizationType":
"LIMITED_COMPANY" } } ], "nisse": 123 }

So that the result becomes:

{ "sessionId": "ce6fc9d0-5923-4d71-9f7e-ae60f35c45d6", "details": [ {
"keyInformation": { "organizationType": "LIMITED_COMPANY" } }, {
"keyInformation": { "dunsNumber": "123", "organizationType": "LIMITED_COMPANY"
} } ], "nisse": 123 }

Thanks.

Hi Andreas, this works for me.

➤ 2023-03-18 14:23:51 CET bz@[local]:5432/test
=# WITH data(j)
AS (VALUES (CAST('{ "sessionId": "ce6fc9d0-5923-4d71-9f7e-ae60f35c45d6",
"details": [ { "keyInformation": { "dunsNumber": "NaN", "organizationType":
"LIMITED_COMPANY" } }, { "keyInformation": { "dunsNumber": "123",
"organizationType": "LIMITED_COMPANY" } } ], "nisse": 123 }' AS jsonb)))

SELECT jsonb_pretty(jsonb_set(j
, '{details}'
, (SELECT jsonb_agg(CASE
WHEN ((elem -> 'keyInformation') ->> 'dunsNumber') = 'NaN'
THEN jsonb_set(elem
, '{keyInformation}'
, (elem -> 'keyInformation') - 'dunsNumber')
ELSE elem
END)
FROM jsonb_array_elements(data.j -> 'details') AS elem))) AS nice_output
FROM data
;
nice_output
{
"nisse": 123,
"details": [
{
"keyInformation": {
"organizationType": "LIMITED_COMPANY"
}
},
{
"keyInformation": {
"dunsNumber": "123",
"organizationType": "LIMITED_COMPANY"
}
}
],
"sessionId": "ce6fc9d0-5923-4d71-9f7e-ae60f35c45d6"
}
(1 row)
Time: 0,731 ms

--
Boris

--
Andreas Joseph Krogh
CTO / Partner - Visena AS
Mobile: +47 909 56 963
andreas@visena.com <mailto:andreas@visena.com>
www.visena.com <https://www.visena.com&gt;
<https://www.visena.com&gt;