Postgresql:如何将 JSONb 键转换为 ENUM 列表?

Postgresql: How to convert JSONb keys into an ENUM list?

我目前正在清理我们应用程序中的一些 tables,我们在一些 tables 中定义了一些 JSONb,其值只是 truefalse 对于给定的键。看到这一点,我想摆脱 jsonb,取而代之的是一个 enum 数组 ,我可以在其中获取 jsonb 的前键(其值为真)

比如我想改造这个table

CREATE TABLE my_table (
   ...
   my_field   JSONB
   ...
);

CREATE TYPE field_enum AS ENUM (
   'key1',
   'key2',
   'key3',
   'key4',
   'key5',
   'key6'
);

CREATE TABLE my_table (
   ...
   my_field   field_enum[] DEFAULT NULL,
   ...
);

并且我希望从(对于此示例)迁移数据

{"key1": true, "key2": null, "key3": false, "key4": true}

['key1','key4']

我正在尝试通过一个独特的命令进行数据迁移来改变我的列类型,我认为这可能是:

ALTER TABLE
    my_table
    ALTER COLUMN
        my_field
    TYPE
        field_enum
    USING __XXXXXX___;

using 部分是我遇到困难的地方,有人知道我应该如何在不丢失数据的情况下更改我的列吗?

我也愿意创建一个新字段并在之后重命名它,并在 table.

上使用更新

我正在考虑使用 jsonb_object_keys 函数,但它首先给了我所有的键,而不仅仅是那些值为真的键,它还给了我一个我无法做到的记录[]转换为枚举[].

甚至更深,但对我来说不是强制性的,因为我可以将其作为 post 处理,json 键可能必须链接到枚举键这不一样,可以说 key1 应该转换为 NEW_KEY(upper_case 和名称更改)。您认为可以包含在同一个 postgresql 命令中吗?

如果你们中有人知道我能做什么,我将不胜感激。

谢谢!

X.

您需要一个函数将 json 对象转换为您的枚举数组:

create or replace function jsonb_to_field_enums(jsonb)
returns field_enum[] language sql immutable
as $$
    select array_agg(key)::field_enum[]
    from jsonb_each_text()
    where value::bool
$$;

Db<>fidlle.