【问题标题】:How can I transform a column containing some strings into multi columns using postgresql?如何使用 postgresql 将包含一些字符串的列转换为多列?
【发布时间】:2019-09-16 21:46:46
【问题描述】:

我有下表(列值的数据类型为varchar,缺少c2、c4等一些值):

__________________________
id |  value
__________________________
1  | {{a1,b1,c1},{a2,b2,}}
__________________________
2  | {{a3,b3,c3},{a4,b4}}
__________________________

我想获得类似的东西:


id | A  |  B  |  C  
__________________
1  | a1 | b1  | c1
__________________
1  | a2 | b2  |   
__________________
2  | a3 | b3  | c3
__________________
2  | a4 | b4  |

我正在尝试使用 regexp_split_to_array,但到目前为止没有任何成功。 如何实现? 谢谢!

【问题讨论】:

  • value是什么数据类型?
  • 列值的数据类型为varchar

标签: sql postgresql


【解决方案1】:

这假设您知道可能的值是什么(例如 a*、b*),否则为值类型生成适当的列将需要动态 sql。

设置:

CREATE TABLE t (id INTEGER, value VARCHAR);

INSERT INTO t
VALUES 
  (1, '{{a1,b1,c1},{a2,b2,}}'),
  (2, '{{a3,b3,c3},{a4,b4}}')
;

查询:

SELECT
    id,
    NULLIF(r[1], '') AS a,
    NULLIF(r[2], '') AS b,
    NULLIF(r[3], '') AS c
FROM (
  SELECT id, regexp_split_to_array(r[1], ',') AS r
  FROM (
    SELECT id, regexp_matches(value, '{([^{][^}]+)}', 'g') AS r
    FROM t
  ) x
) x;

结果:

| id  | a   | b   | c   |
| --- | --- | --- | --- |
| 1   | a1  | b1  | c1  |
| 1   | a2  | b2  |     |
| 2   | a3  | b3  | c3  |
| 2   | a4  | b4  |     |

请注意,如果早期的值可能会丢失,例如{b1,c1} 其中缺少 a1,则查询必须不同。

【讨论】:

    【解决方案2】:

    您可以使用 string_to_array 将字符串转换为数组,然后使用 unnest 将其分解为多行:

    示例

    SELECT unnest(string_to_array('{1 2 3},{4 5 6},{7 8 9}', ','));
    
    
    {1 2 3}
    {4 5 6}
    {7 8 9}
    

    【讨论】:

      猜你喜欢
      • 2023-02-01
      • 2015-04-16
      • 2012-02-02
      • 2020-06-11
      • 2022-10-23
      • 2020-08-05
      • 2022-09-23
      • 2017-08-17
      • 2018-12-30
      相关资源
      最近更新 更多