【问题标题】:Getting JSON field key names in Postgres在 Postgres 中获取 JSON 字段键名
【发布时间】:2017-07-24 12:23:54
【问题描述】:

我有使用 JSON 作为标记联合的数据,因此顶级对象仅包含一个子对象。子对象的类型取决于它在父对象中的键名,而不是一个单独的“标签”字段,这在 C 结构中是正常的。

例如

{"circle":{"radius":10}}
{"square":{"side":10}})
{"rectangle":{"width":10,"height":20}})

这非常适用于 JSON 模式和协议缓冲区。

我已阅读:https://www.postgresql.org/docs/9.6/static/functions-json.html

我正在为 Postgres 的 JSON 函数而苦苦挣扎。如何执行以下 Javascript 的 SQL 等效项

Object.keys({"circle":{"radius":10}})[0]               (== `"circle")
Object.keys({"square":{"side":10}})[0]                 (== `"square")
Object.keys({"rectangle":{"width":10,"height":20}})[0] (== `"rectangle")

带有 JSONB 字段?

【问题讨论】:

标签: json postgresql jsonb postgresql-9.6


【解决方案1】:

有一个jsonb_object_keys 可以使用,就像它的 Javascript 对应物一样。例如:

SELECT jsonb_object_keys(json_column)
FROM MyTable

这显然返回了一个记录集。但是,如果您知道 JSON 对象中只有一个键,那么如果需要,只需将其用作子查询即可。例如:

SELECT *
FROM MyTable
WHERE 'cicle' = (
  SELECT jsonb_object_keys(json_column)
  FROM MyTable
)

编辑

你可以得到一个标量值如下:

SELECT json_build_array(jsonb_object_keys(json_column)) -> 0
FROM MyTable

注意这是 json(即"circle",而不是circle)。如果您需要文本值,请使用->> 运算符。

【讨论】:

  • 有没有办法获得第一个对象键,即将记录集变成标量?
  • 我已经编辑了答案,以提供一个获取标量值的示例
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-05
  • 2018-11-07
  • 2019-12-08
  • 1970-01-01
  • 2014-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多