我有一个由,
分隔的元素文本,如下所示:
'{4,56,7,3,2}'
元素的数量 unkonwn 。
我如何获得最后一个元素?
在上面的示例2
答案 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)
您可以使用简单的文字操作功能LEFT
,strpos
和REVERSE
:
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)]