我有以下输入:,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: ""
这是因为它试图将''
(第一个值)转换为整数。
如何在没有错误的情况下忽略第一个,
(或任何额外,
)?
答案 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,
...)