我有一个表订单,其中包含一个 hstore 类型的字段order_detail,用于保存 json 数据。
现在我想查询我的 json 数据的内部对象。 因为查询有点复杂 我试图在更简单的情况下讲述我的问题。
我已经测试了这 4 个子查询:
-
获取原始保存的 json:
select order_detail::json as original from orders;
此查询成功返回 json 格式的数据。
-
获取order_details内部对象"事务":
select order_detail::json as original, (order_detail -> 'transaction')::json as transaction from order_details;
此查询也可以成功运行。
-
获取该事务的 ID:
select order_detail::json as original, (order_detail -> 'transaction')::json as transaction, ((order_detail -> 'transaction')::json -> 'id')::text as id from order_details;
上述方法也可以成功运行,并在事务中返回原始 json、事务和 id。
-
根据查询 3 的结果进行选择,并获取其中一个结果:
select original from (select order_detail::json as original, (order_detail -> 'transaction')::json as transaction, ((order_detail -> 'transaction')::json -> 'id')::text as id from order_details) s where transaction is null and id is null;
此查询将引发异常!例外情况是:
[22P02] 错误,标记"="无效**
为什么此异常仅在第 4 个查询中出现?谁能帮我解决这个问题?
终于我发现了问题。当你想要在hstore中存储这样一个json字段时,如果你使用一个简单的查询,你可以使用这样的东西:
order_detail -> 'trasaction'
这将毫无问题地返回order_detail字段中哈希存储数据的事务部分。
但是如果你想在嵌套查询中使用这样的东西,你必须明确声明该字段是json。 所以你必须改用这样的东西(在内部查询的所有部分(:
order_detail::json -> 'transaction'