在postgres中将逗号分隔的整数转换为int []

时间:2016-10-20 10:38:01

标签: arrays postgresql casting

我有以下输入:,1,2,3。我想把它投到postgres的int[]

以下查询有效:

select string_to_array('1,2,3', ',')::int[]

-- => "string_to_array" => "{1,2,3}"

但是这个没有:

select string_to_array(',1,2,3', ',')::int[]

-- => ERROR:  invalid input syntax for integer: ""

这是因为它试图将''(第一个值)转换为整数。

如何在没有错误的情况下忽略第一个,(或任何额外,)?

2 个答案:

答案 0 :(得分:3)

(假设问题是从字符串开始/尾随,

使用trim

select string_to_array(trim(both ',' from ',1,2,3,'), ',')::int[];
┌─────────────────┐
│ string_to_array │
├─────────────────┤
│ {1,2,3}         │
└─────────────────┘
(1 row)

如果你想连续处理多个',',你可以使用regexp_replace(带g(全局)标志):

select string_to_array(
         trim(both ',' from regexp_replace(',1,,2,,,3', ',,+', ',', 'g')),
       ',')::int[];
┌─────────────────┐
│ string_to_array │
├─────────────────┤
│ {1,2,3}         │
└─────────────────┘
(1 row)

要使空字符串返回NULL,请使用NULLIF(<string>, '')

select string_to_array(trim(both ',' from regexp_replace(NULLIF('', ''), ',,+', ',', 'g')), ',')::int[];
┌─────────────────┐
│ string_to_array │
├─────────────────┤
│ (null)          │
└─────────────────┘
(1 row)

答案 1 :(得分:2)

Solution with postgres 9.3+ using array_remove (see Remove array values in pgSQL)

select array_remove(string_to_array(',1,2,3', ','), '')::int[];

 -- array_remove
 --------------
 -- {1,2,3}

This will handle any amount of interspersed , in the array (eg: 1,2,,3, ,1,,,2,3,...)