给定类型名称的强制类型

时间:2017-03-10 22:22:25

标签: json postgresql

我有这个json结构,我也存储PostgreSQL类型名称

{  
   "temperature":{  
      "value":"(-75,-70]",
      "type":"int4range"
   }
}

我可以获得诸如

之类的值
SELECT '{"temperature":{"value":"(-75,-70]","type":"int4range"}}'::jsonb #> ARRAY['temperature','value']

现在值类型是文本,我知道我只能在json中存储简单类型但是如何使用我拥有的类型名称动态地将值转换为int4range

1 个答案:

答案 0 :(得分:1)

正如@Bread所说,你无法动态投射数据。

但是你可以这样做:

WITH jsonb as (
    SELECT '{"temperature":{"value":"[-75,-70]","type":"int4range"}}'::json
), fromjsonb as (
    SELECT json->'temperature'->'value' as element,
           json->'temperature'->'type' as type
    FROM jsonb
), trim as (
    SELECT trim(both '"' from element::text) as element,
           trim(both '"' from type::text) as type
    FROM fromjsonb
)
SELECT CASE WHEN type = 'int4range' THEN element::int4range
            -- ELSE element::text
            END
FROM trim;

   case    
-----------
 [-75,-69)
(1 row)

在我的示例中,它选择数据并且无法正常工作,因为PostgreSQL不允许您选择第一行为int4range,然后将第一行选为另一种类型。

但你可以使用同样的逻辑在另一个表格中插入数据(我认为这是你的目标),这样就可以了。