将文本类型的列组合到 postgresql 中的 jsonb 列

Combine columns of text type to a jsonb column in postgresql

我在 postgres 中有一个具有以下结构的 table,其中 id 是主键。

┌──────────────────────────────────┬──────────────────┬───────────┬──────────┬──────────────────────────────────────────────────────────────┬──────────┬──────────────┬─────────────┐
│              Column              │       Type       │ Collation │ Nullable │                           Default                            │ Storage  │ Stats target │ Description │
├──────────────────────────────────┼──────────────────┼───────────┼──────────┼──────────────────────────────────────────────────────────────┼──────────┼──────────────┼─────────────┤
│ id                               │ bigint           │           │          │                                                              │ plain    │              │             │
│ requested_external_total_taxable │ bigint           │           │          │                                                              │ plain    │              │             │
│ requested_external_total_tax     │ bigint           │           │          │                                                              │ plain    │              │             │
│ store_address.country            │ text             │           │          │                                                              │ extended │              │             │
│ store_address.city               │ text             │           │          │                                                              │ extended │              │             │
│ store_address.postal_code        │ text             │

我想将 store_address 字段转换为 jsonb 列。

┌──────────────────────────────────┬──────────────────┬───────────┬──────────┬──────────────────────────────────────────────────────────────┬──────────┬──────────────┬─────────────┐
│              Column              │       Type       │ Collation │ Nullable │                           Default                            │ Storage  │ Stats target │ Description │
├──────────────────────────────────┼──────────────────┼───────────┼──────────┼──────────────────────────────────────────────────────────────┼──────────┼──────────────┼─────────────┤
│ id                               │ bigint           │           │          │                                                              │ plain    │              │             │
│ requested_external_total_taxable │ bigint           │           │          │                                                              │ plain    │              │             │
│ requested_external_total_tax     │ bigint           │           │          │                                                              │ plain    │              │             │
│ store_address                    │ jsonb            │           │          │                                                              │ extended │              │             │

这样做有效率吗?

您需要添加一个新列,更新 table 并填充新的 jsonb 列。之后您可以删除旧列:

alter table the_table 
    add store_address jsonb;
    
update the_table
  set store_address = jsonb_build_object('country', "store_address.country", 
                                         'city', "store_address.city",
                                         'postal_code', "store_address.postal_code");
alter table the_table
  drop "store_address.country", 
  drop "store_address.city",  
  drop "store_address.postal_code"