【问题标题】:Postgres - how select jsonb key value pairs as colums?Postgres - 如何选择 jsonb 键值对作为列?
【发布时间】:2021-05-20 06:52:08
【问题描述】:

test 表中有这样的记录(metrics 列是 jsonb 类型):

id     name      metrics
1      machine1  {"metric1": 50, "metric2": 100}
2      machine2  {"metric1": 31, "metric2": 46}

我想选择指标作为附加列,例如(伪代码):

Select *, json_each(test.metrics) from test;

得到如下结果:

id  name       metric1   metric2 
1   machine1   50        100
2   machine2   31        46

这可能吗?

【问题讨论】:

    标签: sql postgresql postgres-10


    【解决方案1】:

    您可以简单地使用->>

    demo:db<>fiddle

    SELECT
        id,
        name,
        metrics ->> 'metric1' as metric1,
        metrics ->> 'metric2' as metric2
    FROM t
    

    注意,现在metric 列的类型为text。如果您希望它们是 integer 类型,则需要另外转换它们:

    (metrics ->> 'metric1')::int
    

    【讨论】:

    • 好的,很好,谢谢。但我有 50 个指标,想在 Java 客户端中动态映射它们。所以我更愿意通过通配符或其他方式选择它们。这可能吗?
    • 这不可能。输出列必须是预定义的。因此,如果需要,您需要在后端处理您的 JSON。
    【解决方案2】:

    使用-&gt;&gt; 运算符:

    select id, name, 
           metrics ->> 'metric1' as metric1,
           metrics ->> 'metric2' as metric2
    from test;
    

    【讨论】:

    • 好的,很好,谢谢。但我有 50 个指标,想在 Java 客户端中动态映射它们。所以我更愿意通过通配符或其他方式选择它们。这可能吗?
    • @milkamar:不,这是不可能的。但是为什么不简单地将 JSON 发送到 Java 应用程序并在那里进行处理呢?
    • 是的,没打到我。 ObjectMapper 应该可以解决问题。谢谢你:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 2018-03-22
    • 2019-05-04
    • 1970-01-01
    • 2022-11-03
    • 2020-10-31
    • 2022-01-06
    相关资源
    最近更新 更多