PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment remplacer le groupe capturé par l'expression évaluée (en ajoutant une valeur entière au groupe de capture)

Vous ne pouvez pas faire cela dans regexp seul car regexp ne prend pas en charge les mathématiques sur les groupes capturés même s'ils sont tous des caractères numériques. Vous devez donc obtenir le groupe qui représente le numéro d'étage, faire le calcul et le recoller :

SELECT regexp_replace('B12F34', 'B(\d+)F(\d+)', 'Building \1 - Floor ') ||
       ((regexp_matches('B12F34', '[0-9]+$'))[1]::int + 10)::text;

Pas très efficace à cause des deux appels d'expression régulière. Une autre option consiste simplement à obtenir les deux nombres dans une sous-requête et à assembler la chaîne dans la requête principale :

SELECT format('Building %L - Floor %L', m.num[1], (m.num[2])::int + 10)
FROM (
  SELECT regexp_matches('B12F34', '[0-9]+', 'g') AS num) m;