首页 > 解决方案 > Postgresql jsonb 列到行提取值

问题描述

我有下表

BEGIN;

CREATE TABLE IF NOT EXISTS "public".appevents (
    id uuid DEFAULT uuid_generate_v4() NOT NULL,
    "eventId" uuid NOT NULL,
    name text NOT NULL,
    "creationTime" timestamp without time zone NOT NULL,
    "creationTimeInMilliseconds" bigint NOT NULL,
    metadata jsonb NOT NULL,
    PRIMARY KEY(id)
);

COMMIT;

我想通过查询将metadatajsonb 列提取为一行,并尝试使用以下查询。

SELECT 
    userId
FROM 
    appevents, jsonb_to_record(appevents.metadata) as x(userId text)

不幸的是,返回的所有行userid的值都为 NULL,这是不正确的。注意到的唯一奇怪的事情是它正在将驼峰字母转换为小写,但似乎不是问题。

结果_行

这是我目前在数据库中userId存在的两条记录。

记录

标签: postgresqljsonb

解决方案


注意到的唯一奇怪的事情是它正在将驼峰字母转换为小写,但似乎不是问题。

实际上这是罪魁祸首 - 默认情况下,列名不区分大小写,并且userId被规范化为userid,JSON 不包含属性。引用标识符 ( … as x("userId" text)) 应该可以。

但是,有一个更简单的解决方案可以将 json 对象属性作为文本访问:->>操作符。您可以使用

SELECT metadata->>'userId' AS userid FROM appevents

推荐阅读