【发布时间】:2020-05-22 18:50:24
【问题描述】:
我有一个 JSONB 对象:
{"name": "Foo", "interfaces": [{"name": "Bar", "status": "up"}]}
它存储在一个表的jsonb列中
create table device (
device_name character varying not null,
device_data jsonb not null
);
所以我试图通过接口未“启动”的设备的名称来计数。 Group By 用于按 naame 开发计数,但我在查询 json 列表中的值时遇到问题。
我的第一次尝试是:
select device_name, count(*) from device where device_json -> 'interfaces' -> 'status' != 'up' group by device_name;
让我觉得有些事情会变得困难的一些周围数据是:
select count(device_data -> 'interfaces') from device;
我认为这会让我计算所有设备的所有接口,但这是不正确的。它似乎只是从第一项返回计数。
我想我可能需要对内部内容进行子查询或连接。
我一直在考虑,在查找 psql 时,似乎我还没有找到一种方法来查询 jsonb 对象中的列表类型。也许我弄错了。我不想在此之上构建业务层,因为我认为 DBMS 将能够处理这种繁重的工作。
我看到有一个函数 jsonb_array_elements_text(device_data -> 'interfaces')::jsonb -> 'status' 可以返回信息,但我无法在其中进行任何计数,因为count(jsonb_array_elements_text(device_data -> 'interfaces')::jsonb -> 'status') 将返回错误:在不能接受集合的上下文中调用的集合值函数
【问题讨论】:
-
如果您的数组包含多个接口名称怎么办?例如。两个上升,三个下降?
-
我试图从本质上计算“向下”。因此,对于每一行/设备,我会知道有多少接口已关闭。
-
因此,如果一台设备有两个向上和三个向下的接口,您希望该设备的计数为 3?
-
你是对的。我不知道这样做是否会更困难:device_name、count(ALL INTERFACES)、count(DOWN INTERFACE based on STATUS property),但至少,你是正确的。
标签: sql json postgresql