Question

Je compare des données CHAR dans une clause where dans mon sql comme ça,

où PRI_CODE

Le problème que j'ai est quand les valeurs CHAR sont de longueurs différentes. Donc, si PRI_CODE = '0800' et PriCode = '20' il retourne vrai au lieu de faux.

On dirait qu'il compare comme ceci

'08' < '20' 

au lieu de comme

'0800' < '20'

Est-ce un début de comparaison CHAR de la gauche jusqu'à ce que l'un ou l'autre des valeurs de fin?

Si oui, comment puis-je résoudre ce problème?

Mes valeurs peut avoir des lettres si convering à numérique est une option.

Était-ce utile?

La solution

Il n'est pas la comparaison '08' avec '20', il est, comme prévu, en comparant '0800' avec '20'.

Ce que vous ne semblez pas attendre, cependant, est que '0800' (la chaîne) est en effet moins de '20' (la chaîne).

Si la conversion à une comparaison des valeurs numériques numérique est hors de question, vous pouvez utiliser la fonction DB2 suivante:

right ('0000000000'||val,10)

qui vous donnera val rembourré à gauche avec des zéros à une taille de 10 (idéal pour une CHAR(10), par exemple). Ce sera au moins la garantie que les champs sont de la même taille et la comparaison fonctionnera pour votre cas particulier. Mais je vous invite à repenser la façon dont vous faites les choses. Par ligne fonctions échelle rarement bien, en terme de performance

Si vous utilisez z / OS, vous devriez avoir quelques CBM se trouvant juste sur le plancher de la salle informatique en attente pour le travail - vous pouvez probablement demander à l'un d'entre eux pour des conseils plus adaptés à votre application spécifique: -)

Une chose qui vient à l'esprit dans l'utilisation d'un insert / mise à jour et déclencheur PRI_CODE_PADDED colonne secondaire pour maintenir la colonne PRI_CODE entièrement étoffent (en utilisant la même méthode que ci-dessus). Ensuite, assurez-vous que votre variable PriCode est de la même mise en forme avant d'exécuter le select ... where PR_CODE_PADDED < PriCode.

Encourir que le coût à insérer / heure de mise à jour sur tous l'amortir Selects vous êtes susceptible de le faire (qui, parce qu'ils ne sont plus en utilisant des fonctions par ligne, sera ultra rapide), vous donnant ainsi une meilleure performance globale (en supposant que votre base de données est l'une de ces bêtes incroyablement rares qui sont écrits plus de lecture, bien sûr).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top