【发布时间】:2012-09-29 12:07:48
【问题描述】:
我正在尝试在 PostgreSQL 9.0.1 中进行稍微复杂的字符串转换。 my_col 中的值是长字符串,格式为:
'12345_sometext_X12B_1'
'12345_sometext_optionaltext_Y09B_1'
'12345_sometext_optionaltext_X12A_1'
我需要将“X12”部分转换为已知数值,有几个不同的已知值(最多 5 个)。
我希望能够在一个查询中确定这一点,而无需子查询。但是,以下内容对我不起作用。最后一列是引发异常的列。由于某种原因,我似乎无法使用这些函数的输出组合来执行CASE 语句。我将前面的列包括在内仅用于演示目的。
select
regexp_matches(my_col, E'^.*_([^_]*)[A-Z]{1}_\\d*$'), -- returns {'X12'}
(regexp_matches(my_col, E'^.*_([^_]*)[A-Z]{1}_\\d*$'))[1], -- returns 'X12'
case (regexp_matches(my_col, E'^.*_([^_]*)[A-Z]{1}_\\d*$'))[1]
when 'X12' then '1200'
when 'Y09' then '950'
else '?' end -- should return '1200' but throws error
from my_table;
相反,我得到了错误:
ERROR: set-valued function called in context that cannot accept a set
SQL state: 0A000
有人可以给我建议吗?
【问题讨论】:
-
第一:更新,您使用的是过时版本。升级到 9.0.10 以进行错误修复、安全性和稳定性改进。无需转储和重新加载,只需安装新的二进制文件即可。
标签: regex postgresql postgresql-9.0 set-returning-functions