sql >> Base de Datos >  >> RDS >> PostgreSQL

Cómo reemplazar el grupo capturado con la expresión evaluada (agregando un valor entero al grupo de captura)

No puede hacer esto solo en regexp porque regexp no admite matemáticas en grupos capturados, incluso si todos son caracteres numéricos. Así que tienes que obtener el grupo que representa el número de piso, hacer los cálculos y volver a empalmarlo:

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

No es muy eficiente debido a las dos llamadas a expresiones regulares. Otra opción es simplemente obtener los dos números en una subconsulta y ensamblar la cadena en la consulta principal:

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;