Thread
-
Delete values from JSON
Andreas Joseph Krogh <andreas@visena.com> — 2023-03-17T07:56:51Z
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> <https://www.visena.com> -
Re: Delete values from JSON
Romain MAZIÈRE <romain.maziere@sigmaz-consilium.fr> — 2023-03-17T10:56:22Z
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 : > > 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> > <https://www.visena.com> -
Re: Delete values from JSON
Andreas Joseph Krogh <andreas@visena.com> — 2023-03-17T11:06:05Z
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> 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> <https://www.visena.com> -
Re: Delete values from JSON
Boris Zentner <bzm@2bz.de> — 2023-03-18T13:26:57Z
> 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 -
Re: Delete values from JSON
Andreas Joseph Krogh <andreas@visena.com> — 2023-03-18T17:07:40Z
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> <https://www.visena.com>