我有一列在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,但是没有得到想要的结果。 任何帮助将不胜感激。
答案 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)
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
regexp_split_to_array
在给定的定界符的帮助下拆分字符串。在这种情况下,-
或/
(array)::decimal[]
将字符串数组转换为数字数组a[X]
给出数组的第X个元素COALESCE(a[3], 0)
如果不存在第三部分(而不是0
),则给出null