J'exécute une requête dans la base de données Oracle. La colonne et tout est correct, mais j'obtiens une erreur de numéro non valide pour la requête ci-dessous:

select COUNT(*) AS "COUNT" from NE.STRUCT B
where B.STRUCT_TYPE in ('IDC') 
and NET_ENTITY_ID is not null 
and length(NET_ENTITY_ID) = 18 
AND regexp_like(SUBSTR(NET_ENTITY_ID,15,1),'[^A-Z]') 
and TO_NUMBER(SUBSTR(NET_ENTITY_ID,(length(NET_ENTITY_ID) -3), 4)) < 6000;

Le champ NET_ENTITY_ID ne contient qu'une seule donnée ABCDEFGHXXXXNB0001.

Mais il n'est pas nécessaire qu'il y ait toujours une seule donnée. C'est juste pour résoudre le problème que je considère seulement cela.

Message d'erreur:

ORA-01722: invalid number
01722. 00000 -  "invalid number"
*Cause:    The specified number was invalid.
*Action:   Specify a valid number.
0
Yogi Bear 5 janv. 2016 à 13:53

2 réponses

Meilleure réponse

Le problème est qu'Oracle - et toute autre base de données - ne garantit pas l'ordre d'évaluation des clauses dans un WHERE. Vous pouvez contourner ce problème en utilisant CASE:

where B.STRUCT_TYPE in ('IDC') and
      NET_ENTITY_ID is not null and
      length(NET_ENTITY_ID) = 18 AND
      regexp_like(SUBSTR(NET_ENTITY_ID, 15, 1), '[^A-Z]') and 
      (CASE WHEN regexp_like(SUBSTR(NET_ENTITY_ID,(length(NET_ENTITY_ID) -3), 4), '^[0-9]{4}$'
            THEN TO_NUMBER(SUBSTR(NET_ENTITY_ID,(length(NET_ENTITY_ID) -3), 4)) 
       END) < 6000;
2
Gordon Linoff 5 janv. 2016 à 11:50

Vous devez vous assurer que les 4 derniers caractères sont numériques avant d'utiliser TO_NUMBER sur eux.

Cela le fera:

select COUNT(*) AS "COUNT" from 
( SELECT * FROM NE.STRUCT B
  where B.STRUCT_TYPE in ('IDC') 
  and NET_ENTITY_ID is not null 
  and length(NET_ENTITY_ID) = 18 
  AND regexp_like(SUBSTR(NET_ENTITY_ID,15,1),'[^A-Z]') 
  AND regexp_like(SUBSTR(NET_ENTITY_ID,-4),'[0-9]') 
)
where TO_NUMBER(SUBSTR(NET_ENTITY_ID,-4)) < 6000;

NB j'ai simplifié votre SUBSTR pour obtenir les 4 derniers caractères.

0
Tony Andrews 5 janv. 2016 à 11:10