Hi Team,

We are using Postgresql JSONB as storage type in our development.
In the below table , RECORD column has JSONB data and we create a view which 
will derive the column "TEST_MV_2" from column "RECORD" as below

CREATE OR REPLACE VIEW public."V_TEST_SELECT"
AS
   SELECT a.recid,    a.record AS "RECORD",
   jsonb_path_query(a.xmlrecord, '$."2"'::jsonpath) AS "TEST_MV_2 "
   FROM " TEST_SELECT " a;

So we might have array of data or an empty JSON object or an array of empty 
JSON object or a string in the column "TEST_MV_2".
Null is stored as empty JSON object due to our business logic.

RECID
RECORD (datatype: JSONB)
TEST_MV_2 (datatype: JSONB)
"SELTEST1"
"{"1": "SELTEST1", "2": [{"": "TESTVALUE"}, {}]}"
[{"": "TESTVALUE"}, {}]
"SELTEST2"
"{"1": "SELTEST2", "2": "TESTVALUE"}"
"TESTVALUE"
"SELTEST3"
"{"1": "SELTEST3", "2": [{"": "TESTVALUE"}, {"": "TESTVALUE1"}]}"
[{"": "TESTVALUE"}, {"": "TESTVALUE1"}]
"SELTEST4"
"{"1": "SELTEST4", "2": [{"": "TESTVALUE4MV1"}, {}]}"
[{"": "TESTVALUE4MV1"}, {}]
"SELTEST5"
"{"1": "SELTEST5", "2": [{}, {}]}"
[{},{}]
"SELTEST6"
"{"1": "SELTEST6", "2": {}}"
{}
"SELTEST7"
"{"1": "SELTEST7", "2": [{}, {"": "TESTVALUE"}]}"
[{}, {"": "TESTVALUE"}]


In such cases, to find the null values in the JSONB, I have written below SQL 
Function to handle different type of data

CREATE OR REPLACE FUNCTION jsonbNull(jsonb_column JSONB)
returns boolean as $$
declare
              isPoint text := jsonb_typeof(jsonb_column) ;
begin
              CASE isPoint
                             WHEN 'array' THEN
                                           if  true = ALL(select 
(jsonb_array_elements(jsonb_column)) = '{}') THEN
                                                          return true;
                                           else
                                                           return false;
                                           end if;
                            WHEN 'object' THEN
                                           if jsonb_column = '{}' THEN
                                                          return true;
                                           else
                                                          return false;
                                           end if;
                             WHEN 'string' THEN
                                                          return false;
                             ELSE
                                           return true;
              END CASE;
end;
$$ LANGUAGE plpgsql IMMUTABLE;

Sample SQL statement used:
SELECT RECID,"TEST_MV_2" FROM "V_TEST_SELECT" WHERE true=jsonbNull("TEST_MV_2") 
 ORDER BY RECID ;


I would like to know whether we can handle multiple types of JSONB data in a 
better/nicer way as this function could impact performance of the query.

Kindly provide your suggestions.

Thanks,
[cid:image001.png@01D46E21.E2244170]
RISWANA
Technical Lead

TEMENOS India
Sterling Road, Chennai
d: + 91 9943613190

[cid:image002.png@01D45B44.8C6E0030]<https://www.linkedin.com/company/temenos/>[cid:image003.png@01D45B3E.3EA72B70]<https://twitter.com/Temenos>[cid:image004.png@01D45B3E.3EA72B70]<https://www.facebook.com/TemenosGroup>[cid:image005.png@01D45B3E.3EA72B70]<https://www.youtube.com/user/TemenosMarketing>
  
temenos.com<http://www.temenos.com/?utm_source=signature&utm_medium=email&utm_campaign=new-signature&utm_content=email>




The information in this e-mail and any attachments is confidential and may be 
legally privileged. It is intended solely for the addressee or addressees. Any 
use or disclosure of the contents of this e-mail/attachments by a not intended 
recipient is unauthorized and may be unlawful. If you have received this e-mail 
in error please notify the sender. Please note that any views or opinions 
presented in this e-mail are solely those of the author and do not necessarily 
represent those of TEMENOS. We recommend that you check this e-mail and any 
attachments against viruses. TEMENOS accepts no liability for any damage caused 
by any malicious code or virus transmitted by this e-mail.

Reply via email to