sql >> Base de Datos >  >> RDS >> Oracle

Eliminación de ceros a la izquierda del desarrollador varchar sql

Oracle tiene TRIM incorporado Funciones para cadenas. Suponiendo que tiene una cadena como '00012345' y desea mantenerlo como una cadena, no convertirlo en un NUMBER real , puede usar el LTRIM función con el segundo set opcional parámetro que especifica que estás recortando ceros:

select ltrim('000012345', '0') from dual;

LTRIM
-----
12345

Si también tiene espacios iniciales, puede recortar ambos a la vez:

select ltrim(' 00012345', '0 ') from dual;

LTRIM
-----
12345

También puede convertir a un número y viceversa, pero eso parece mucho trabajo a menos que tenga otro formato que desee eliminar:

select to_char(to_number('000012345')) from dual;

Por cierto, la razón inmediata por la que obtienes el ORA-01722 en tu primer intento es que estás usando el + numérico operador en lugar del operador de concentración de cadenas de Oracle || . Está haciendo una conversión implícita de su cadena a un número, lo que parece que está tratando de evitar, y la conversión implícita del espacio único, para lo que sea, está causando el error. (Posiblemente, algunos de sus valores no son, de hecho, números; otro ejemplo de por qué los números deben almacenarse en NUMBER los campos; y si ese es el caso, la conversión (o conversión) a un número y viceversa aún obtendría el ORA-01722). Obtendrías lo mismo en el segundo intento si estuvieras usando LENGTH en lugar de LEN . Tampoco funcionaría de todos modos como INSTR no reconoce expresiones regulares. Podrías usar REGEXP_INSTR en cambio, pero estarías mejor con el REGEXP_REPLACE de @schurik versión si querías ir por ese camino.

No estoy seguro de entender la edición de tu pregunta. Parece que su inserción se puede simplificar a:

INSERT INTO temp_table (columnNeedTrim, column2, column3, column4, column5)
SELECT LTRIM(table1.columnNeedTrim, '0 '),
    table1.column2,
    table1.column3,
    table1.column4,
    table1.column5
FROM table1
INNER JOIN table2 ON table2.columnNeedTrim = table1.columnNeedTrim
WHERE NOT EXISTS (
    SELECT * FROM temp_table
    WHERE columnNeedTrim = LTRIM(t42.columnNeedTrim, '0 '));

(No entiendo por qué está haciendo una subconsulta en su versión, o por qué está obteniendo el valor recortado de otro subconsulta.)

También podría usar MERGE :

MERGE INTO temp_table tt
USING (
    SELECT LTRIM(t42.columnNeedTrim, '0 ') AS columnNeedTrim,
        t42.column2,
        t42.column3,
        t42.column4,
        t42.column5
    FROM t42 
    INNER JOIN t43 ON t43.columnNeedTrim=t42.columnNeedTrim
) sr
ON (sr.columnNeedTrim = tt.columnNeedTrim)
WHEN NOT MATCHED THEN
INSERT (tt.columnNeedTrim, tt.column2, tt.column3, tt.column4, tt.column5)
VALUES (sr.columnNeedTrim, sr.column2, sr.column3, sr.column4, sr.column5);