在Postgres

时间:2017-07-24 12:23:54

标签: json postgresql jsonb postgresql-9.6

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

e.g。

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

这与JSON Schema和Protocol Buffers非常吻合。

我看过: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字段?

1 个答案:

答案 0 :(得分:3)

您可以使用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)。如果您需要文本值,请使用->>运算符。