根据条件分为多列

时间:2019-12-05 09:40:38

标签: postgresql split

我有一列在postgres中有4000条记录的记录,我需要根据最大数量在col1中,最小col2中和col3中的条件分成多个列.col类型是text 给定的列是这样的

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,但是没有得到想要的结果。 任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

如果模式被连字符和斜杠分开,则可以使用带有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个,则最右边的项目将为空。

答案 1 :(得分:0)

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