J'ai un texte d'éléments séparés par , comme suit:

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

La quantité d'élément est inconnue .

Comment obtenir le dernier élément? dans l'exemple ci-dessus 2

2
java 24 déc. 2015 à 14:55

3 réponses

Meilleure réponse

Essaye ça:

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

DÉMO FIDDLE

MODIFIER:

Essayer

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

DEMO

1
Rahul Tripathi 24 déc. 2015 à 12:14

Si la valeur est effectivement stockée avec les accolades, vous pouvez simplement la convertir dans un tableau et choisir le dernier élément du tableau:

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

Comme vous n'avez pas inclus la définition de la table, j'ai supposé que la colonne était nommée elements.

Si la colonne ne contient pas les accolades, mais simplement une liste de valeurs séparées par des virgules, vous pouvez toujours utiliser cette approche:

select (string_to_array(elements,','))[array_length(string_to_array(elements,','), 1)]
1
a_horse_with_no_name 24 déc. 2015 à 13:12

Vous pouvez utiliser de simples fonctions de manipulation de texte LEFT, strpos et 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

Production:

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

MODIFIER:

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

1
a_horse_with_no_name 24 déc. 2015 à 13:08