Woj*_*rek 19 arrays postgresql
[编辑]这个问题的原始标题是"以声明的方式获取Postgres数组的最后一个元素"
如何在Postgres中获取数组的最后一个元素?
我需要以声明方式进行,因为我想将它用作ORDER BY标准.我不想为它创建一个特殊的PGSQL函数,在这种情况下对数据库的更改越少越好.
实际上,我想要做的是按包含多个单词的特定列的最后一个单词进行排序.此处不能更改模型.
换句话说,我想将Ruby推sort_by {|x| x.split[-1]}入数据库级别.我可以使用Postgres string_to_array或regexp_split_to_array函数将值拆分为单词数组,然后如何获取其最后一个元素?
Mar*_*ers 36
如果我正确理解你的问题你有一个字符串,你首先将它拆分在某个分隔符上,然后找到数组的最后一个元素并丢弃其余的元素.
你可能会错过中间人并直接获得最后一个元素:
SELECT regexp_replace('foo bar baz', '^.* ', '')
Run Code Online (Sandbox Code Playgroud)
结果:
baz
Run Code Online (Sandbox Code Playgroud)
And*_*eas 15
从 Postgres 字符串中获取最后一个单词:
在 postgresql 14 中你可以这样做:
SELECT split_part('this is my word', ' ', -1);
Run Code Online (Sandbox Code Playgroud)
word从示例中的字符串中获取最后一个单词
这是 psql14 的新功能,因为现在split_part接受负索引
有关详细信息,请参阅变更日志
Fra*_*ens 13
SELECT array_upper(ARRAY[1,2,5,6], 1);
Run Code Online (Sandbox Code Playgroud)
问:我想要做的是按特定列的最后一个字排序
处理实际的数组text(不是字符串)时,请array_upper()在索引中使用.
WITH x(a) AS (
VALUES
('{zoo, zar, zaz}'::text[])
,('{3,4,5,6}')
,('{foo, bar, baz}')
)
SELECT *
FROM x
ORDER BY a[array_upper(a, 1)];
Run Code Online (Sandbox Code Playgroud)
WITH x(a) AS (
VALUES
('{{zoo, zar, zaz}
,{4,5,6}
,{14,15,16}
,{foo, bar, zzzaz}}'::text[])
,('{{zoo, zar, baz}
,{4,5,6}
,{14,15,16}
,{foo, bar, aaaaz}}'::text[])
)
SELECT *
FROM x
ORDER BY a[array_upper(a, 1)][array_upper(a, 2)];
Run Code Online (Sandbox Code Playgroud)
更新:问题已被编辑,所以我更新了我的答案。
您还可以使用 array_upper() 返回元素本身(而不仅仅是其索引):
SELECT arr[array_upper(arr, 1)] FROM (SELECT ARRAY[1,2,3,6] AS arr) AS t
Run Code Online (Sandbox Code Playgroud)
所以答案是:
SELECT arr[array_upper(arr, 1)] FROM (SELECT string_to_array('one two three', ' ') AS arr) AS t
Run Code Online (Sandbox Code Playgroud)
结果:'three'
| 归档时间: |
|
| 查看次数: |
19942 次 |
| 最近记录: |