0

我有以下表结构:

server_id server_databases
1 [{“name”:“mssql”,“count”:12},{“name”:“postgresql”,“count”:1}]
2 []
3 无效的

结果我想收到什么(我想保留服务器 2 和 3,如果它是 null 或空对象无关紧要):

server_id 数据库
1 {“mssql”:12,“postgresql”:1}
2 无效的
3 无效的

我尝试自己构建 json

SELECT server_id,
       (
           select '{' || listagg('"' || x.name || '":' || x.count, ',') || '}' as clientdatabases
           from (
                    select cb."name"::varchar as name, sum(cb."count")::int as count from e.server_databases as cb group by name
                ) x
       )
FROM my_table e

但它因有趣的错误而失败

[XX000] 错误:由于内部错误,不支持查询。详细信息:不支持的见证案例 其中:nested_decorrelate_calc_witness_unsupported|calc_witness

看起来 PartiQL支持这种情况,但我不知道如何实现它。我现在将使用 UDF。但是,如果您可以帮助我提供“本机”解决方案,那就太棒了。

更新用于案例再现的 SQL 脚本:

CREATE table my_table(server_id int, server_databases super);

insert into my_table(server_id, server_databases) values (
                                                    1, json_parse('[{"name": "mssql", "count": 12},{"name": "postgresql", "count": 1}]')
                                                   ),
                                                   (2, json_parse('[]')),
                                                   (3, null);
SELECT server_id,
       (
           select '{' || listagg('"' || x.name || '":' || x.count, ',') || '}' as clientdatabases
           from (
                    select cb."name"::varchar as name, sum(cb."count")::int as count from e.server_databases as cb group by name
                ) x
       )
FROM my_table e;
4

1 回答 1

0

ISNULL在计数中使用:

SELECT server_id,
       (
           select '{' || listagg('"' || x.name || '":' || x.count, ',') || '}' as clientdatabases
           from (
                    select cb."name"::varchar as name, ISNULL(sum(cb."count")::int,0) as count from e.server_databases as cb group by name
                ) x
       )
FROM my_table e
于 2022-01-28T09:22:21.183 回答