0
votes

DB2: convertir Varcharne en argent

J'ai 2 valeurs de varchar (64) qui sont des décimales dans ce cas (par exemple, la colonne1 et la colonne2, les varcharilles, les nombres décimaux (argent)). Je dois créer une clause où je dis cela:

CAST(COLUMN1 AS DECIMAL(9,2)) < CAST(COLUMN2 AS DECIMAL(9,2))

db2

2 commentaires

Cela devrait être aussi facile, pourquoi pensez-vous que ce n'est pas? Avez-vous une erreur?


Charles, oui, je reçois l'erreur "Caractère non valide trouvé dans un argument de chaîne de caractères de la fonction" décimal ".. sqlcode = -420, sqlstate = 22018". J'utilise la syntaxe exacte que j'ai donnée dans mon exemple.


3 Réponses :


1
votes

C'est vraiment si facile ... cela fonctionne bien ...

select *
from table 
where translate(column1, '           ','0123456789.')
      <> ' '
     or translate(column2, '           ','0123456789.')
      <> ' '


2 commentaires

Charles, cela a du sens. J'ai découvert quand j'exécute la requête pour le mois précédent complet, il fonctionne bien sans erreur. Lorsque je l'exécute pour le mois en cours, j'obtiens l'erreur "caractère invalide". Pour moi, cela dit qu'il y a un résultat dans le mois en cours qui a un caractère non numérique frappe l'erreur. Merci pour l'info.


Juste fyi, c'était des nulls causant la question. Je me suis débarrassé de ceux-ci et la requête courait bien.



3
votes

Vous pouvez créer un UDF comme ceci pour vérifier quelles valeurs ne peuvent pas être moulées sur décimal xxx

par exemple xxx < / pré>

retournerait xxx


0 commentaires

0
votes

Il y a une capacité intégrée à faire cela sans UDFS.
La fonction xmlast code> ci-dessous fait la moulage "Safe" entre (var) char code> et décfloat code> (vous pouvez utiliser comme double code> ou comme décimal (x, y) code> à la place, si vous voulez). Il renvoie null code> s'il est impossible de lancer.
Vous pouvez utiliser une telle expression deux fois dans le où la clause CODE>.

SELECT 
  S
, xmlcast(xmlquery('if ($v castable as xs:decimal) then xs:decimal($v) else ()' passing S as "v") as decfloat) D 
FROM (VALUES ( '  123.45 '),('-00.12'),('£546'),('12,456.88')) T (S);

|S        |D                                         |
|---------|------------------------------------------|
|  123.45 |123.45                                    |
|-00.12   |-0.12                                     |
|£546     |                                          |
|12,456.88|                                          |


1 commentaires

Oui, pratique si vous n'avez pas d'autorisations pour créer un UDF.