在PostgreSQL中获取逗号分隔值列表中的最后一个值

3
在 PostgreSQL 表中,我有一个列包含如下值:
AX,B,C
A,BD
X,Y
J,K,L,M,N

简而言之,每条记录的该列中将有几个逗号分隔的字符串。我想要获取每条记录中的最后一个字符串。最终我得到了以下结果。

select id, reverse(substr(reverse(mycolumn),1,position(',' in reverse(mycolumn)))) from mytable order by id ; 

有没有更简单的方法?

5
你正在 PostgreSQL 内创建自己的逗号分隔数据结构,该结构专门设计用于创建和存储数据结构。为什么这样做? - kba
赶快修复你的模式,否则就为时已晚了。请查看 http://dba.stackexchange.com/questions/55871/postgresql-list-of-integers-separated-by-comma-or-integer-array-for-performance 和 http://dba.stackexchange.com/questions/17808/is-using-multiple-foreign-keys-separated-by-commas-wrong-and-if-so-why。 - Craig Ringer
@Craig Ringer - 感谢您的指引。该列实际上只包含一个属性 - 机构名称 - 其中可以在逗号之间。而名称的最后一部分具有一定的相关性,这就是我想要提取它的原因。我认为没有必要将其分离到同一表或另一个表中的单独列中。 - Jayadevan
@Jayadevan 好的,这听起来比描述中说的要少疯狂一些;-) 有时候放弃规范化是必要的(例如住宅/邮政地址的噩梦)。我担心你可能正在做最近我看到每个人都在做的那种在文本字段中使用逗号分隔数组的事情。 - Craig Ringer
3个回答

12

我会这样做:

select reverse(split_part(reverse(myColumn), ',', 1))

谢谢,比我的好。让我们看看是否有更短的。 - Jayadevan
1
将结果用另一个反转包装起来:select reverse(reverse(split_part(reverse(myColumn), ',', 1))) - tusharnegi

10

使用regexp_replace函数:

select id, regexp_replace(mycolumn, '.*,', '')
from mytable
order by id;

它可能不是通用解决方案,因为“.*”可能会错过一些字符。我更喜欢使用reverse(split_part(reverse(myColumn), ',', 1)) - paulz

2

有更简单的方法吗?

就你目前的数据而言,我认为戈登的答案是最好的选择。其他选项可能是正则表达式(混乱),或将列转换为文本[]数组,例如('{' || col || '}')::text[]或其变体。

如果你使用的是文本[]数组而不是纯文本作为列,你应该直接使用数组函数:

select col[array_length(col, 1)]

http://www.postgresql.org/docs/current/static/functions-array.html

以下是使用虚拟数据的示例:

 with bar as (
 select '{a,b,c}'::text[] as foo
 )
 select foo[array_length(foo, 1)] from bar;

当然,您也可以创建一个parse_csv()函数或get_last_csv_value()函数来避免编写上述内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接