es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para extraer el último - en el valor, puedes utilizar la función INSTR dos veces, con el segundo INSTR comenzando desde el final de la cadena utilizando el parámetro -1. Luego, puedes utilizar la función SUBSTR para obtener la subcadena desde la posición del último - hasta el final de la cadena. Aquí tienes un ejemplo:

    SUBSTR(it.remark, INSTR(it.remark, '-', -1) + 1)
    

    Esto devolverá la subcadena que comienza desde el último - hasta el final de la cadena remark en la tabla it. Puedes utilizar esta expresión en lugar de substr(it.remark, instr(it.remark,'-')+1,3) en tu consulta original para extraer el identificador de etiqueta para unirlo con la tabla sp.

Comments are closed.