提问者:小点点

PostgreSQL-jsonb-如何使用jsonpath获取查询中值的数据类型


在使用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

谢谢你们


共2个答案

匿名用户

当您尝试将jsonb值直接转换为另一种数据类型时,postgres将尝试首先将其转换为json文本,然后进行解析。见

  • 如何将Postgres json(b)转换为整数?
  • 如何将Postgres json(b)转换为浮点数?
  • 如何将Postgres json(b)转换为文本?
  • 如何将Postgres json(b)转换为布尔值?

当你的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