In PostgreSQL using jsonb column, is there a way to select / convert an attribute with actual datatype the datatype instead of getting it as a string object when using jsonpath? I would like to try to avoid cast as well as -> and ->> type of construct since I have to select many attributes with very deep paths, I am trying to do it using jsonpath and * or ** in the path
Is it possible to do it this way or must I use the -> and ->> for each node in the path ? This will make the query look complicated as I have to select about 35+ attributes in the select with quite deep paths.
Also, how do we remove quotes from the selected value?
This is what I was trying, but doesn’t work to remove quotes from Text value and gives an error on numeric
Select
PolicyNumber AS "POLICYNUMBER",
jsonb_path_query(payload, '$.**.ProdModelID')::text AS "PRODMODELID",
jsonb_path_query(payload, '$.**.CashOnHand')::float AS "CASHONHAND"
from policy_json_table
the PRODMODELID still shows the quotes around the value and when I add ::float to second column, it gives an error
SQL Error [22023]: ERROR: cannot cast jsonb string to type double precision
Thank you
2
Answers
jsonb_path_query
function returns data with quotes (""), so you cannot cast this to integer or float. For casting value to integer, you need value without quotes.You can use this SQL for getting without quotes:
If you need to use exactly
jsonb_path_query
then you can trim these quotes:When you try to directly cast the
jsonb
value to another datatype, postgres will attempt to first convert it to a json text and then parse that. SeeWhen you have strings in your JSON values, to avoid the quotes you’ll need to extract them by using one of the json functions/operators returning text. In your case: