【问题标题】:How to select size of json array in postgres?如何在 postgres 中选择 json 数组的大小?
【发布时间】:2020-10-14 08:43:36
【问题描述】:

我已经为此奋斗了很长时间,但我无法构建一个查询,该查询将选择(并且最好还按顺序)数组中的项目计数。

我确实有这样的表格数据:

ID    Data
1     {"$id": "1", "InnerArray": [{"$id": "1", "Timestamp": "2020-06-18T09:43:19.4873323+01:00"}, {"$id": "3", "Timestamp": "2020-06-19T08:25:35.7768657+00:00"}]}
etc...

我尝试了什么...

SELECT JSON_ARRAY_LENGTH("Data" ->'InnerArray'::json) AS lengtha
FROM "mystorage"

还有

SELECT JSON_ARRAY_LENGTH("Data"::json ->'InnerArray'::json) AS lengtha

不过如此

SQL Error [22P02]: ERROR: invalid input syntax for type json
  Detail: Token "InnerArray" is invalid.
  Position: 49
  Where: JSON data, line 1: InnerArray

我尝试了很多不同的格式,但是来自 MS SQL 世界,我对 PostgreSQL 的理解似乎有点有限。

【问题讨论】:

  • 与你的问题无关,但是:你真的应该避免那些可怕的引用标识符。他们的麻烦比他们的价值要多得多。 wiki.postgresql.org/wiki/…

标签: sql arrays json postgresql


【解决方案1】:

-> 运算符的右侧参数应该是 text 值,而不是 json 值。因此,演员 'InnerArray'::json 不需要开始。

但这也是您出错的原因,因为'InnerArray' 不是有效的 JSON 值,因此您不能将其强制转换为一个。

用途:

SELECT json_array_length("Data"::json -> 'InnerArray') AS lengtha

顺便说一句:如果您确实存储 JSON 值,则您的列应定义为 jsonb(或至少 json),而不是使用 text(或 varchar)并在每次您想使用时强制转换它JSON 函数。

【讨论】:

  • 哇,我以为我试过一千次了。另外,我的数据存储为 json 数据类型,但它是由 3rd 方产品定义的,所以无论如何我都无法更改。谢谢。
  • @JiříHerník:如果该列被定义为json,你可以去掉演员表。
【解决方案2】:

您缺少一个}。试试这个:

select json_array_length('{"$id": "1", "InnerArray": [{"$id": "1", "Timestamp": "2020-06-18T09:43:19.4873323+01:00"}, {"$id": "3", "Timestamp": "2020-06-19T08:25:35.7768657+00:00"}]}'::json->'InnerArray') as lengtha

最好的问候,
比亚尼

【讨论】:

  • 谢谢,我修好了,但重点是,我需要从数据库字段中选择它,而不是内联。
猜你喜欢
  • 2017-05-04
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 2016-08-27
  • 1970-01-01
  • 2019-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多