Je dois personnaliser une valeur de colonne spécifique d'une requête. où j'ai quatre types de cas comme
AbsentDays = case when AbsentDays = 0.00 then convert(int, AbsentDays) when AbsentDays >= 1.00 then convert(decimal(10, 1), AbsentDays) -- when AbsentDays = 0.50 -- then 0.5 end
et ma sortie attendue serait comme
1 0 6 0.5 2 1 3 1.5 4 2 5 2.5
Pour ce faire, j'ai essayé ceci écrit ci-dessous
empcode AbsentDays 1 0.00 6 0.50 2 1.00 3 1.50 4 2.00 5 2.50
Mais en utilisant cela, je ne peux pas obtenir le résultat souhaité, cela remplace d'autres valeurs.
3 Réponses :
Vous pouvez le faire en le convertissant en float
car les zéros les plus à droite après la virgule décimale sont coupés en float
:
select empcode, cast(AbsentDays as float) from tbl
@ArnaudPeralta Non, ce n'est pas le cas. Quel SGBD utilisez-vous? Dans SSMS, ce n'est pas comme ça.
C'était un exemple, mais float est mauvais en général dans la base de données. Vous trouverez facilement quelques exemples.
@ArnaudPeralta Veuillez fournir un exemple valide lorsque vous essayez de réfuter une réponse. Je viens de lancer 0,5 pour flotter et le résultat était de 0,5
Essayez ceci: SELECT FORMAT (CAST (15.12 AS FLOAT), 'g17')
. C'est étrange de justifier le fait qu'un flotteur n'est pas précis ...
Je n'ai rien mentionné sur la fonction format
que vous utilisez. Essayez simplement SELECT CAST (15.12 AS FLOAT)
et voyez que cela ne se produit pas.
J'utilise le format pour éviter l'arrondi du serveur sql, avec cela, nous pouvons voir que les données sont modifiées, et ce n'est pas ce que l'op demandait. Personne dans la base de données n'utilise la valeur flottante, il y a une raison.
J'ai juste essayé SELECT CAST (5.1223423532530 AS FLOAT)
et rien n'a été arrondi!
Parce que l'arrondi est sur un nombre significatif.
Merci pour la discussion. C'est merveilleux d'apprendre une nouvelle chose.
Ne lancez pas comme un flottant, vous perdrez en précision.
SELECT FORMAT(CAST(2.0 AS DECIMAL(9,6)), 'g15') -- will print 2 SELECT FORMAT(CAST(0.50 AS DECIMAL(9,6)), 'g15') -- will print 0.5
Notez que format () est disponible à partir de SQL Server 2012.
Une colonne ne peut avoir qu'un seul type de données. Afin de voir les différents cas de la manière que vous décrivez, vous devrez utiliser un type de données varchar
/ nvarchar
:
AbsentDays = case when AbsentDays = floor(AbsentDays) then convert(nvarchar(max),convert(int, AbsentDays)) -- change to int if no decimal part else convert(nvarchar(max),convert(decimal(10, 1), AbsentDays)) -- else return one decimal end
p >
Je voterais pour, mais vous utilisez un type de caractère et n'incluez pas la longueur.
Et n'ignorons pas l'utilisation déroutante du "type de données texte" alors que "type de données chaîne" aurait été un meilleur choix - parce que TEXT est un type de données.
Très observateur, je n'y suis pas très habitué, merci. Je modifierai en conséquence.
Pour une colonne, vous ne pouvez avoir qu'un seul type de données, idéalement, vous devriez le faire dans l'interface utilisateur ou changer le type en varchar
+1 sur l'interface utilisateur pour le faire; mais mauvaise idée sur le
varchar
. Stocker des décimales sous forme devarchar
ne sera rien d'autre qu'une douleur à l'avenir.