PostgreSQL获取逗号分隔的值列表中的最后一个值
在PostgreSQL表中,我有一个列,其值如下PostgreSQL获取逗号分隔的值列表中的最后一个值,sql,postgresql,Sql,Postgresql,在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 ; 有更简单的方法吗?我会这样做: select reverse(spli
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 ;
有更简单的方法吗?我会这样做:
select reverse(split_part(reverse(myColumn), ',', 1))
有没有更简单的方法
对于您当前的数据,Gordon的答案在我看来效果最好。其他选项可能是正则表达式(凌乱),或者将列转换为text[]数组,例如(“{'| col | |}”)::text[]
或其变体
如果对列使用text[]数组而不是纯文本,则需要直接使用数组函数:
select col[array_length(col, 1)]
具有虚拟数据的示例:
with bar as (
select '{a,b,c}'::text[] as foo
)
select foo[array_length(foo, 1)] from bar;
当然,您也可以创建一个
parse_csv()
函数或get_last_csv_value()
函数,以避免写入上述内容。使用regexp\u replace
:
select id, regexp_replace(mycolumn, '.*,', '')
from mytable
order by id;
谢谢,比我的好。让我们看看是否有较短的数据结构。用另一个反向符号包装结果:选择reverse(reverse(split_part(reverse(myColumn),“,”,1)),这样您就可以在PostgreSQL内部创建自己的逗号分隔数据结构,该数据结构专门用于创建和存储数据结构。为什么?现在就修复你的模式,否则就太晚了。请参阅和@Craig Ringer-感谢您的指点。该列实际上只包含一个属性—机构名称—中间可以有逗号。名字的最后一部分有一定的相关性,这就是为什么我想提取它。我不认为有必要在同一张表或另一张表中将其单独列出来。@Jayadevan好的,这比描述听起来更疯狂;-)现在是时候放弃正常化了(例如,住宅/邮政地址的噩梦)。我担心你可能在做我每天都会看到的那种逗号分隔的文本字段数组。。。人。。。他们的狗最近也这样做了。这可能不是一个通用的解决方案,因为
*
可能会错过一些角色。我更喜欢reverse(拆分部分(reverse(myColumn),,,,1))
。