在使用jsonb列的PostgreSQL中,有没有办法选择/转换具有实际数据类型的属性数据类型,而不是在使用jsonpath时将其作为字符串对象获取?我想尽量避免强制转换以及-
有没有可能这样做,或者我必须使用-
此外,我们如何从所选值中删除引号?
这是我正在尝试的,但无法从文本值中删除引号,并在数字上给出错误
Select
PolicyNumber AS "POLICYNUMBER",
jsonb_path_query(payload, '$.**.ProdModelID')::text AS "PRODMODELID",
jsonb_path_query(payload, '$.**.CashOnHand')::float AS "CASHONHAND"
from policy_json_table
PRODMODELID仍然显示值周围的引号,当我将::float添加到第二列时,它会给出一个错误
SQL Error [22023]: ERROR: cannot cast jsonb string to type double precision
谢谢你们
当您尝试将jsonb
值直接转换为另一种数据类型时,postgres将尝试首先将其转换为json文本,然后进行解析。见
当你的JSON值中有字符串时,为了避免引号,你需要使用返回文本的json函数/运算符之一来提取它们。在你的例子中:
SELECT
PolicyNumber AS "POLICYNUMBER",
jsonb_path_query(payload, '$.**.ProdModelID') #>> '{}' AS "PRODMODELID",
(jsonb_path_query(payload, '$.**.CashOnHand') #>> '{}')::float AS "CASHONHAND"
FROM policy_json_table
jsonb_path_query
函数返回带引号的数据 (""), 因此不能将其转换为整数或浮点数。要将值转换为整数,您需要不带引号的值。
您可以使用此SQL获取不带引号:
Select
PolicyNumber AS "POLICYNUMBER",
(payload->>'ProdModelID')::text AS "PRODMODELID",
(payload->>'CashOnHand')::float AS "CASHONHAND"
from policy_json_table
如果您需要完全使用jsonb_path_query
,那么您可以修剪这些引号:
Select
PolicyNumber AS "POLICYNUMBER",
jsonb_path_query(payload, '$.**.ProdModelID')::text AS "PRODMODELID",
trim(jsonb_path_query(payload, '$.**.CashOnHand')::text, '"')::float AS "CASHONHAND"
from policy_json_table