Postgresql:如何将 JSONb 键转换为 ENUM 列表?
Postgresql: How to convert JSONb keys into an ENUM list?
我目前正在清理我们应用程序中的一些 tables,我们在一些 tables 中定义了一些 JSONb,其值只是 true
或 false
对于给定的键。看到这一点,我想摆脱 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
$$;
我目前正在清理我们应用程序中的一些 tables,我们在一些 tables 中定义了一些 JSONb,其值只是 true
或 false
对于给定的键。看到这一点,我想摆脱 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
$$;