Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL获取逗号分隔的值列表中的最后一个值_Sql_Postgresql - Fatal编程技术网

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

在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(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))