ORA-01722: número no válido 01722. 00000 – “número no válido” *Causa: El número especificado no es válido. *Acción: Especifique un número válido.
Soy nuevo en Oracle SQL Developer y hoy mientras ejecutaba esto:
select r.id, r.date, it.group, it.comment, it.item, it.remark, r.summary,
substr (it.remark, instr(it.remark,'ABC')+8,7 ) as label1,
cast(substr (it.remark, instr(it.remark,'-')+1,3 ) as integer) as label2
from it_table it
inner join sp_table sp on sp.id = substr (it.remark, instr(it.remark,'ABC')+8,7 ) and sp.label_id = cast(substr (it.remark, instr(it.remark,'-')+1,3 ) as integer)
inner join sq_table sq on sq.id = sp.id
where it.date > '01-jan-2020' and it.remark like '%ABC%' and it.group= 'O'
order by sp.id, it.id;
Capturó el siguiente error:
ORA-01722: número no válido
01722. 00000 - "número no válido"
*Causa: Se especificó un número no válido.
*Acción: Especificar un número válido.
Creo que el problema radica en la extracción en la fila 3 (cast(substr (it.remark, instr(it.remark,'-')+1,3 ) as integer)
), donde necesito convertir una cadena en un número usando cast
.
Según la documentación aquí, el error ocurre cuando se intenta convertir una cadena de caracteres en un número y la cadena no se puede convertir en un número válido.
Entonces, intenté reemplazar:
cast(substr (it.remark, instr(it.remark,'-')+1,3 ) as integer)
con
to_number(substr (it.remark, instr(it.remark,'-')+1,3 ))
e incluso intenté to_char
, pero no funcionó. Sin embargo, el script original parece funcionar bien en la base de datos de pruebas. Me pregunto por qué está sucediendo esto. Cualquier ayuda es muy apreciada.
Actualización:
Datos de ejemplo para it
:
ID DATE NAME GROUP REMARK COMMENT ...
100 20-10-08 AABC X ACS LOCATION 1 - ABC IDD x105213-1<br>
101 20-10-08 AxB Y MN LOCATION 8 - ABC IDD x105244-2
...
Datos de ejemplo para sp
:
ID DATE NAME GROUP label_id<br>
105213 20-10-08 AABC X 1<br>
105244 20-10-08 AxB Y 2
...
Resulta que el error se debió a tener 2 -
en remark
, lo que llevó a la ambigüedad y solo necesito el segundo.
Entonces, la nueva pregunta es:
¿Cómo puedo extraer el último -
en el valor para unirlo con otro valor en la otra columna?
davy.ai
Para extraer el último
-
en el valor, puedes utilizar la funciónINSTR
dos veces, con el segundoINSTR
comenzando desde el final de la cadena utilizando el parámetro-1
. Luego, puedes utilizar la funciónSUBSTR
para obtener la subcadena desde la posición del último-
hasta el final de la cadena. Aquí tienes un ejemplo:Esto devolverá la subcadena que comienza desde el último
-
hasta el final de la cadenaremark
en la tablait
. Puedes utilizar esta expresión en lugar desubstr(it.remark, instr(it.remark,'-')+1,3)
en tu consulta original para extraer el identificador de etiqueta para unirlo con la tablasp
.