2010-05-11 6 views
1

J'essaie de comprendre pourquoi, sur certains systèmes, j'obtiens un message d'erreur de nombre invalide lorsque j'essaie de sélectionner une valeur d'une colonne varchar2 alors que sur d'autres systèmes, je ne comprends pas l'erreur tout en faisant exactement la même chose.select from varchar2 colonne avec une valeur numérique donne parfois une erreur de numéro invalide

Le tableau est quelque chose comme ceci:

ID Column_1 Column_2 
1   V  text 
2   D  1 
3   D  2 
4   D  3 

et une requête:

select ID 
    from table 
where column_1='D' 
    and column_2 = :some_number_value 

: some_number_value est toujours numérique, mais peut être nul.

Nous avons fixé la requête:

select ID 
    from table 
where column_1='D' 
    and column_2 = to_char(:some_number_value) 

Cette requête originale fonctionne bien sur la plupart des systèmes, mais sur certains systèmes donne une erreur « numéro non valide ». La question est pourquoi? Pourquoi cela fonctionne-t-il sur la plupart des systèmes et pas sur certains?

Répondre

3

Cela dépend de l'ordre dans lequel vos conditions sont vérifiées. Si la condition pour column_1 est évaluée en premier, alors la conversion implicite de column_2 en un nombre fonctionne. Si column_2 est vérifié en premier, la conversion de text en un nombre échoue.

L'optimiseur décide dans quel ordre les conditions sont évaluées. Si vous avez un index sur column_2 mais pas sur column_1 par exemple, cet index va probablement être utilisé, donc la conversion échouera. Qu'est-ce que vous entendez par "valeur_numère est toujours numérique mais peut être null"? La vérification pour column_2 = NULL ne retournera aucune ligne, NULL ne peut être évaluée qu'en utilisant IS NULL, et non = NULL.

+0

Salut merci, ça l'explique. La requête avec la valeur null ne doit renvoyer aucune ligne, cela fonctionne correctement de cette façon. Bien sûr, nous pouvons mettre du code pour que la requête ne soit pas exécutée quand: some_number_value est null. – Rene

Questions connexes