当前位置: 首页 > 知识库问答 >
问题:

为PostgreSQL JSONB列选择给定键内的条目数

章远航
2023-03-14
{"kay1": val1, "myMap": {"UniqueKey1": "UniqueValue1", "UniqueKey2": "UniqueValue2", "UniqueKey3": "UniqueValue3", "UniqueKey4": "UniqueValue4"}, "key2": {"key3": {"key4": "val4"}, "val3": {"key5": "val5"}}

我在这里发现了类似的问题:Postgres json键计数。

但是,它需要密钥的名称,这可以不使用密钥名称吗?

解决方案

SELECT id, count(elements)
FROM (SELECT id, jsonb_object_keys(column -> 'myMap') AS elements
      FROM myTable GROUP BY id
     ) x
GROUP BY id
SELECT id, (SELECT count(*)
            FROM (SELECT jsonb_object_keys(a->'myMap')
                  FROM test_json x where x.id = y.id
                  ) z
            ) count
FROM test_json y group by id;
SELECT id, ARRAY_LENGTH(ARRAY(SELECT jsonb_object_keys(column -> 'myMap')), 1) AS count
FROM myTable
CREATE OR REPLACE FUNCTION jsonb_object_keys_length(_j jsonb)
RETURNS INT LANGUAGE SQL IMMUTABLE AS
'SELECT ARRAY_LENGTH(ARRAY(SELECT jsonb_object_keys(column -> 'myMap')), 1)';
CREATE INDEX idx_myMapCount ON myTable (jsonb_object_keys_length(column -> 'myMap'));

在查询中使用函数:

SELECT id, jsonb_object_keys_length(column -> 'myMap') AS count
FROM myTable

如果有更好的方法来建模这个查询,请给出建议。谢了!

共有1个答案

梁丘波鸿
2023-03-14

有一个名为json_object_keys的函数,它可能是这个问题的关键部分。它接受一个json对象,并将键作为关系的行返回。

=# create table test_json (a json);
CREATE TABLE
=# insert into test_json values ('{"kay1": 1, "myMap": {"UniqueKey1": "UniqueValue1", "UniqueKey2": "UniqueValue2", "UniqueKey3": "UniqueValue3", "UniqueKey4": "UniqueValue4"}, "key2": {"key3": {"key4": "val4"}, "val3": {"key5": "val5"}}}');
INSERT 0 1
=# select json_object_keys(a) from test_json;
 json_object_keys 
------------------
 kay1
 myMap
 key2
(3 rows)
=# select json_object_keys(a->'myMap') from test_json;
 json_object_keys 
------------------
 UniqueKey1
 UniqueKey2
 UniqueKey3
 UniqueKey4
(4 rows)

从那里,您可以将其封装在子查询中,如下所示:

=# select count(*) from (select json_object_keys(a->'myMap') from test_json) x;
 count 
-------
     4
(1 row)

编辑添加:有一个jsonb等效项(jsonb_object_keys),它与jsonb值相同。对不起,我倾向于用普通的JSON来做我的测试用例。

 类似资料:
  • 在给定JWS(JWT)头的JWKS密钥存储中,是否有选择签名验证密钥的标准方法? 我的目标是实现OpenID连接ID令牌验证库,我尝试灵活地预测不同的配置,但如果密钥选择是特定于IdP的,我不确定这样做是否有意义。 我当前的算法遍历JWKS并过滤掉: 如果JWK有“使用”字段,如果“使用”不等于“sig”,则拒绝 如果JWK有“密钥操作”字段,如果“密钥操作”不包含“验证”,则拒绝该字段。 如果J

  • 问题内容: 我只想选择特定的列(例如)。我有一个通用的DAO,我想到的是: 错误是: 。我应该如何改变呢?我想获取一个类型对象,该对象仅具有和字段,而其他所有对象都是。 类型扩展有两个字段。 是。 问题答案: 仅获取特定列的JPA方法之一是请求一个Tuple对象。 在您的情况下,您需要编写如下内容: 如果您有一个代表结果的类(例如您的情况),则可以采用另一种方法。不必是Entity类。如果具有类似

  • 问题内容: 我有两个这样的表,两个都是单独的表 另一个表包含以下结构 我需要从表II中选择AccountNo或TempAccountNo,Mycolumn,条件是 我需要选择 我需要选择 我该如何实现。 问题答案:

  • 我对SQL并不陌生,但我对Hibernate完全陌生。我预计,给定一个列值,从表中选择一组对象将是一项非常简单的任务。但我做不到。 我的导师和下面的这个问题都建议了同样的事情,这让我写了下面的代码: JPA:如何基于除ID之外的字段值获取实体? 这是可行的,但方法是已被弃用。由于我对hibernate还不熟悉,我不妨按照它的预期工作方式来学习它,所以我不想使用不推荐的方法。 官方的Hibernat

  • 问题内容: 我正在尝试创建一个Android应用程序,该应用程序将在给定范围内(但在它们之间 不 相等)生成一系列随机值(在这种情况下为整数),并在简单的TextView中显示它们 假设我们有范围 R = [1、2、3、4、5、6、7、8、9、10、11、12、13] 每次我按下 “生成” 按钮时,我想随机生成5个不同的结果 每个“生成”的示例: 4,9,2,12,10 5、1、6、8、13 10

  • 问题内容: 我的问题的示例架构在SQLFiddle中给出,如下所示: 在在线游戏中,我想选择对手,该对手可以在玩家或中。 所需的示例输入/输出 也就是说,所需的数据可以在任何列中,但是我需要有条件地或以任何其他方式在单列中输出。我听说过MySQL条件列,但无法创建查询以获取所需的输出。有人可以帮助您进行必要的查询吗? 编辑 基于此链接,我运行以下查询,但失败。 问题答案: 我认为您可以使用以下语法