如何在postgresql文本中获取最后一个元素?

时间:2015-12-24 11:55:23

标签: sql postgresql

我有一个由,分隔的元素文本,如下所示:

'{4,56,7,3,2}'

元素的数量 unkonwn

我如何获得最后一个元素? 在上面的示例2

3 个答案:

答案 0 :(得分:1)

试试这个:

SELECT regexp_replace('4,56,7,3,2', '^.*,', '')

<强> FIDDLE DEMO

修改

尝试

SELECT replace(replace(regexp_replace('4,56,7,3,2', '^.*,', ''),'{',''),'}','')

<强> DEMO

答案 1 :(得分:1)

您可以使用简单的文字操作功能LEFTstrposREVERSE

SELECT val,
     CASE WHEN strpos(REVERSE(val),',') = 0 THEN val
          ELSE REVERSE(LEFT(REVERSE(val), strpos(REVERSE(val),',')-1))  
     END AS last_element
FROM tab;

SqlFiddleDemo

输出:

╔════════════════╦══════════════╗
║      val       ║ last_element ║
╠════════════════╬══════════════╣
║ 4,56,7,3,2     ║ 2            ║      
║ 1,11111,23121  ║ 23121        ║      
║ 123            ║ 123          ║
║ (null)         ║ (null)       ║
╚════════════════╩══════════════╝

修改

WITH cte AS
(
    SELECT REPLACE(REPLACE(val, '{', ''), '}', '') AS val
    FROM tab
)
SELECT val,
     CASE WHEN strpos(REVERSE(val),',') = 0 THEN val
           ELSE REVERSE(LEFT(REVERSE(val), strpos(REVERSE(val),',')-1))  
     END AS last_element
FROM cte;

SqlFiddleDemo2

答案 2 :(得分:1)

如果值确实与花括号一起存储,您只需将其转换为数组并选择最后一个数组元素:

select (elements::text[])[array_length(elements::text[],1)]
from the_table;

由于您没有包含表定义,因此我假设该列名为elements

如果列包含花括号,但只是逗号分隔的值列表,您仍然可以使用此方法:

select (string_to_array(elements,','))[array_length(string_to_array(elements,','), 1)]