以声明的方式从Postgres字符串中获取最后一个单词

Woj*_*rek 19 arrays postgresql

[编辑]这个问题的原始标题是"以声明的方式获取Postgres数组的最后一个元素"

如何在Postgres中获取数组的最后一个元素?

我需要以声明方式进行,因为我想将它用作ORDER BY标准.我不想为它创建一个特殊的PGSQL函数,在这种情况下对数据库的更改越少越好.

实际上,我想要做的是按包含多个单词的特定列的最后一个单词进行排序.此处不能更改模型.

换句话说,我想将Ruby推sort_by {|x| x.split[-1]}入数据库级别.我可以使用Postgres string_to_arrayregexp_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)

  • `^` 是字符串的开始。`.` 是任何字符。`*` 是所有实例。所以这是用空字符串替换从字符串开头到空格字符的所有内容。如果您用任何分割字符替换空格字符(例如 / 用于目录以在末尾获取文件名),它将获取“最后一个”标记。只要确保你的字符串不以空格结尾哈哈。 (4认同)

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

使用array_upper():

SELECT array_upper(ARRAY[1,2,5,6], 1);
Run Code Online (Sandbox Code Playgroud)

  • 好吧,它返回最后一个元素的索引,而不是元素本身.因此,如果不创建临时表/数组/函数,仍然无法以声明方式使用它. (5认同)
  • 为了记录,这个答案是不正确的.见下面的我的 (4认同)
  • 你的答案是100%正确的,但是这个例子可能令人困惑,因为索引和max数组索引的值都是4(因为PostgreSQL数组从1开始).将示例中的"4"更改为几乎任何其他数字会使*返回的*更清晰. (2认同)
  • @leonbloy:我会说它是不完整的,而不是不正确的。 (2认同)

Erw*_*ter 9

问:我想要做的是按特定列的最后一个字排序

处理实际的数组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)


ale*_*sky 5

更新:问题已被编辑,所以我更新了我的答案。

您还可以使用 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'


Yot*_*yte 5

您可以执行以下操作:

SELECT (ARRAY[1,8,3,7])[array_upper(ARRAY[1,8,3,7], 1)];

即获取索引,然后选择最后一个元素。