/ / Reemplazar cadena donde ++ existe SQL - sql, oracle, oracle11g

Reemplace la cadena donde ++ existe SQL - sql, oracle, oracle11g

Esto se relaciona con mi Pregunta anterior

Lo que ahora quiero hacer es en mi columna de valor, si hay alguna instancia de ++, sustitúyala por 999.

Así que por ejemplo si tengo 1+2++3esto debería actualizarse a 1+2+999+3

¿Cómo logro esto?

Gracias

Respuestas

0 para la respuesta № 1

Configuración de Oracle:

CREATE TABLE your_table ( value ) AS
SELECT NULL     FROM DUAL UNION ALL
SELECT "1"      FROM DUAL UNION ALL
SELECT "1+2"    FROM DUAL UNION ALL
SELECT "1++2"   FROM DUAL UNION ALL
SELECT "+1"     FROM DUAL UNION ALL
SELECT "1+"     FROM DUAL UNION ALL
SELECT "1+2++3" FROM DUAL;

Consulta:

SELECT TRIM( BOTH "+" FROM REPLACE( "+" || value || "+", "++", "+999+" ) )
FROM   your_table

Salida:

VALUE
---------
999
1
1+2
1+999+2
999+1
1+999
1+2+999+3

Si puede tener más de un elemento faltante para reemplazar en una fila, entonces necesita una solución más complicada:

Configuración de Oracle:

CREATE TABLE your_table ( value ) AS
SELECT NULL      FROM DUAL UNION ALL
SELECT "1"       FROM DUAL UNION ALL
SELECT "1+2"     FROM DUAL UNION ALL
SELECT "1++2"    FROM DUAL UNION ALL
SELECT "+1"      FROM DUAL UNION ALL
SELECT "1+"      FROM DUAL UNION ALL
SELECT "1+2++3"  FROM DUAL UNION ALL
SELECT "1+2+++3" FROM DUAL UNION ALL
SELECT "+"       FROM DUAL;

Consulta:

SELECT ( SELECT LISTAGG(
COALESCE(
REGEXP_SUBSTR( t.value, "(.*?)(+|$)", 1, LEVEL, NULL, 1 ),
"999"
),
"+"
) WITHIN GROUP ( ORDER BY LEVEL )
FROM   DUAL
CONNECT BY LEVEL <= REGEXP_COUNT( t.value, "+" ) + 1
) AS value
FROM   your_table t

Salida:

VALUE
-------------
999
1
1+2
1+999+2
999+1
1+999
1+2+999+3
1+2+999+999+3
999+999