web-dev-qa-db-fra.com

SQL convertir nvarchar à float

J'ai une table avec une colonne Quantity; dans la table d'origine, cette colonne est définie par nvarchar(100). Je dois donc la convertir en float pour pouvoir effectuer certaines analyses:

CAST([Quantity] AS FLOAT) AS Quantity      

Le problème est que j'ai certaines valeurs qui ne peuvent pas être converties en float comme No-Quantity, Return etc. Je souhaite que le filtre exclue ces valeurs, puis convertisse rest en float.On est une clause use where:

WHERE Quantity IN ('Return', 'Sales')

Ce n'est pas la meilleure solution car si nous avons de nouvelles valeurs dans la table d'origine, je dois déterminer ce que c'est et l'ajouter à la clause where. 

Je me demande s'il existe un meilleur moyen d'identifier les valeurs non convertibles?

5
Amir

Dans n'importe quelle base de données, vous pouvez utiliser cast() et quelque chose comme ceci:

(case when quantity not in ('No-Quantity', 'Return', . . .)
      then CAST([Quantity] as float)
 end) as Quantity  

La liste in serait la liste des valeurs de chaîne connues. 

Vous pouvez également faire un test rapide et sale comme ceci:

(case when left(quantity, 1) between '0' and '1'
      then CAST([Quantity] as float)
 end) as Quantity   

(Remarque: vous devrez peut-être utiliser substr() ou substring() au lieu de left().)

Et, en général, toute base de données spécifique a des fonctions spécifiques qui peuvent aider à la conversion, telles que try_convert() mentionné dans un commentaire.

4
Gordon Linoff

Si votre serveur SQL prend en charge TRY_CONVERT, cela pourrait fournir une solution intéressante:

SELECT TRY_CONVERT (float, [Quantity]) ...

vous donnera les valeurs converties ou NULL en fonction de l’entrée. Cela peut être utile si vous n’exercez pas un contrôle strict sur les données.

1
CSmith

Autre moyen (si vous ne pouvez pas utiliser TRY_CONVERT)

SELECT CAST(quantity AS float)
FROM myTable
WHERE IsNumeric(quantity) = 1 AND quantity IS NOT NULL
0
Horaciux