【问题标题】:split into multilple column based on condition根据条件拆分为多列
【发布时间】:2019-12-05 18:19:29
【问题描述】:

我在 postgres 中有一个包含 4000 条记录的列,我需要根据以下条件将其拆分为多个列 给定的列是这样的

values
30-20/0.5
20/0.55
30/0.5
30-20/0.5
30/0.55

要求的输出应该是这样的

 values val1  val2
 30     20    0.5
 20     0.55   0
 30     20    0.5
 30     0.55    0

我已尝试拆分 _part,但它没有给出预期的结果。 任何帮助将不胜感激。

【问题讨论】:

    标签: postgresql split


    【解决方案1】:

    Click: demo:db<>fiddle

    SELECT
        a[1] as col1,
        a[2] as col2,
        COALESCE(a[3], 0) as col3
    FROM (
        SELECT
            (regexp_split_to_array(values, '[-/]'))::decimal[] as a
        FROM
            mytable
    ) s
    
    1. regexp_split_to_array 在给定分隔符的帮助下拆分字符串。在这种情况下 -/
    2. 可选:(array)::decimal[] 将字符串数组转换为数字数组
    3. a[X] 给出数组的第 X 个元素
    4. 如果第三部分不存在,COALESCE(a[3], 0) 会给出0(而不是null

    【讨论】:

    • 您的解决方案确实有效....但是我如何更新表格以存储更改
    • @ S-Man 当我尝试更新它时给我 SELECT 错误,如果用 SET 替换 SELECT 我得到了 'as' 错误
    • 我更新为更新 mytable SET col1 = a[1], col2 = COALESCE (a[2],0) , col3 = COALESCE(a[3], 0) FROM ( SELECT (regexp_split_to_array (values, '[-/]'))::decimal[] as a FROM mytable ) s,但更新需要 2 分钟。然后在 col2 中它只是添加 0.5 而在 col3 中添加为 0
    【解决方案2】:

    如果模式由连字符和斜杠分割,您可以使用带有 regex_split_to 数组 (https://www.postgresql.org/docs/current/functions-string.html#id-1.5.8.9.7.2.2.29.1.1) 的正则表达式,如下所示

    SELECT
        split.array[1] as col1,
        split.array[2] as col2,
        split.array[3] as col3
    FROM (
        SELECT regexp_split_to_array('30-20/0.5', '-|\/') AS array
    ) AS split;
    

    只需将字符串替换为对表和列的查询即可。

    为了对数组进行排序,您需要创建一个自定义函数来对数组进行排序。

    CREATE OR REPLACE FUNCTION array_sort_desc(ANYARRAY)
    RETURNS ANYARRAY LANGUAGE SQL
    AS $$
    SELECT ARRAY(
        SELECT $1[s.i] AS col
        FROM generate_series(array_lower($1,1), array_upper($1,1)) AS s(i)
        ORDER BY col DESC
    );
    $$;
    

    这样你就可以得到这样的订单

    SELECT
        split.array[1] as col1,
        split.array[2] as col2,
        split.array[3] as col3
    FROM (
        SELECT array_sort_desc(regexp_split_to_array(your_column, '[-/]')::numeric[]) AS array
        FROM your_table
    ) AS split;
    

    如果元素少于 3 个,则最右边的项目将为空。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-10
      • 2010-10-31
      • 2021-11-25
      • 2021-12-11
      • 2017-08-15
      • 2023-01-11
      相关资源
      最近更新 更多