J'ai cherché un peu sur l'utilisation de cast ou de convert, mais j'ai échoué dans ma requête.
Voici ma requête en ce moment:
"Conversion failed when converting the varchar value 'TK' to data type smallint." error.
J'ai essayé d'utiliser la casse et la conversion comme ceci:
CASE WHEN ENR.GR = '-1' THEN CAST('TK' as varchar(2))
WHEN ENR.GR = '0' THEN CAST('K' as varchar(1))
ELSE ENR.GR
END AS 'Grade'
Je n'ai pas été en mesure de l'exécuter sans obtenir le
CASE WHEN ENR.GR = '-1' THEN 'TK' WHEN ENR.GR = '0' THEN 'K' ELSE ENR.GR END AS 'Grade'
Désolé, cela a probablement été demandé à plusieurs reprises, si quelqu'un pouvait expliquer ce que je fais de mal ou m'indiquer le bonne direction, je l'apprécierais.
3 Réponses :
Votre conversation doit aller avec la partie ELSE :
CASE WHEN ENR.GR = -1
THEN 'TK'
WHEN ENR.GR = 0
THEN 'K'
ELSE CAST(ENR.GR AS VARCHAR(255))
END AS 'Grade'
Vous n'avez pas besoin d'utiliser un guillemet simple avec une valeur numérique. Utilisez simplement:
CASE WHEN ENR.GR = '-1'
THEN 'TK'
WHEN ENR.GR = '0'
THEN 'K'
ELSE CAST(ENR.GR AS VARCHAR(255))
END AS 'Grade'
Merci beaucoup, c'était plus simple que ce à quoi je m'attendais. Je vous en suis reconnaissant!
En supposant que la colonne gr est smallint, vous devez la convertir en varchar:
CASE
WHEN ENR.GR = -1 THEN 'TK'
WHEN ENR.GR = 0 THEN 'K'
ELSE CAST(ENR.GR AS VARCHAR(6))
END AS 'Grade'
En effet, l'expression CASE renvoie exactement un type de données et il tente de convertir le résultat de toutes les branches WHEN et ELSE vers ce type de données. Le type de données résultant est choisi basé sur la priorité . Comme smallint a une priorité plus élevée que varchar, il tente de convertir 'DK' et 'K' en smallint.
Vous devez convertir le smallint en varchar.
DECLARE @gr smallint = -1;
SELECT
CASE WHEN @gr = '-1' THEN 'TK' ELSE CASE WHEN @gr = '0' THEN 'K' ELSE CAST(@gr AS VARCHAR(10)) END END AS Grade