0
votes

format d'un numérique

J'ai un problème avec le retour de ma requête, j'utilise DB2.

Au lieu d'avoir XX, ZZZ j'ai XX.ZZZ (par exemple: 12.123 et 12.123) .Ensuite, j'ai un problème dans un calcul à l'intérieur mon programme principal utilisant le résultat.

Comment puis-je changer le format numérique?

Voici le code que j'utilise, et je veux convertir " myTable.myAmount "au format XX, ZZZ

Merci

select CASE WHEN myTable.myNb>30 
then myTable.myAmount
ELSE '0' END AS PAR30 from myTable


6 commentaires

type de données de la colonne myAmount?


Si un autre système a besoin que la représentation soit modifiée, vous devriez probablement effectuer la conversion là-bas, pas dans la requête.


myAmount est un float, mais mon problème est le format, je veux avoir ce format "12 123" mais le format initial est comme ça 12.123


Vous devez modifier les paramètres régionaux de la table et / ou de la base de données. C'est quelque chose que vous ne devriez pas essayer de gérer vous-même directement.


Le type de données float n'a pas de "format". Vous pouvez avoir un problème avec le format, si vous lisez un résultat flottant dans une variable chaîne au lieu d'une variable d'un type de données numérique. Tu fais ça? Votre langage de programmation ne prend-il pas en charge les types de données float / double / decimal?


Attention: vous avez une colonne myAmount ce que vous spécifiez est un float. Si myAmount stocke des valeurs monétaires, effectuer des calculs mathématiques sur les résultats peut vous surprendre! Pour de meilleurs résultats, stockez dans un type décimal de base 10 (de préférence à virgule fixe); c'est-à-dire NUMERIC ou DECIMAL .


3 Réponses :


0
votes

Donc c'est résolu, j'ai fait une conversion en int, je ne sais pas pourquoi j'ai besoin de convertir un nombre en nombre mais ça marche maintenant.

SELECT
    CASE WHEN myNb > 30 THEN cast(myAmount as INT)
         ELSE '0' END AS PAR30
FROM myTable;

Merci à tous p >


1 commentaires

Même ici, vous utilisez différents types de données dans les types de données THEN (int) et ELSE (varchar). C'est un style de programmation assez mauvais. Quel type de données choisiriez-vous pour votre colonne, si vous étiez un compilateur db2? Ne faites pas de telles choses, si vous n'aimez pas les surprises ...



1
votes

Comme il a été souligné précédemment, les flottants n'ont pas un format "chaîne" fixe, ils sont stockés sous forme de structure de 16 octets dans la base de données que vous pouvez examiner comme ceci:

db2 "values varchar_format(decimal(0.1,5,1), '990.999')"

1                                                                                                                                                                                                                                                             
--------------
   0.100       

La manière dont il sera affiché dépend uniquement du client. Par exemple. DB2 CLP s'appuiera sur la LOCALE de votre environnement.

Les flottants par défaut sont affichés dans la notation scientifique:

export LC_ALL="pl_PL.UTF-8"
db2 connect to sample
db2 "values decimal(0.1,5,1)"

1      
-------
    0,1

Le séparateur de champ décimal est le plus évident avec le type de données décimal:

XXX

Maintenant, je m'attendrais à ce que le changement de LC_NUMERIC en une locale qui utilise la virgule comme séparateur devrait affecter le résultat, mais ce n'est pas le cas. Pour DB2 CLP, il faut changer LC_ALL (au moins en fonction de mon test rapide). Par exemple:

db2 "values decimal(0.1,5,1)"

1      
-------
    0.1

Si vous voulez un format textuel spécifique et que je ne veux pas que Db2 fasse le travail, vous pouvez utiliser VARCHAR_FORMAT :

XXX

(ou quel que soit le format souhaité)


0 commentaires

0
votes

Prenons l'exemple suivant:

>db2 "describe select CASE WHEN myTable.myNb>30 then myTable.myAmount ELSE '0' END AS PAR30 from (values (float(1.23), 30)) myTable(myamount, mynb)"

 Column Information

 Number of columns: 1

 SQL type              Type length  Column name                     Name length
 --------------------  -----------  ------------------------------  -----------
 996   DECFLOAT                 16  PAR30                                     5



>db2 "describe select CASE WHEN myTable.myNb>30 then myTable.myAmount ELSE 0 END AS PAR30 from (values (float(1.23), 30)) myTable(myamount, mynb)"

 Column Information

 Number of columns: 1

 SQL type              Type length  Column name                     Name length
 --------------------  -----------  ------------------------------  -----------
 480   DOUBLE                    8  PAR30                                     5

L'exemple montre comment obtenir les types de données de colonne d'une instruction select.
La seule différence entre 2 instructions est l'utilisation de '0' par rapport à 0 dans la clause ELSE .
Nous voyons que DB2 utilise le type de données DECFLOAT dans le premier cas et DOUBLE dans le deuxième.
C'est probablement la cause première du problème: si une application utilise une variable de chaîne pour obtenir une valeur DECFLOAT (certains langages de programmation / applications peuvent ne pas avoir un type de données variable approprié pour un tel type de base de données), alors le résultat dépend des paramètres régionaux / d'application locaux - nous pouvons obtenir le signe . ou , comme séparateur décimal.
Mais, la plupart des langages / applications de programmation ont un type de données variable approprié pour le type de données de base de données DOUBLE , donc, il ne devrait pas y avoir de problème à moins que l'on utilise une variable de chaîne pour lire une telle valeur encore.


0 commentaires