Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment convertir une sous-chaîne SQL en décimal ?

Ne dites pas à quel point cela sera efficace :

Select convert(decimal(28,10), rtrim(ltrim(replace(REPLACE(AdditionalDescription,'%',''), ',','.')))) As AdditionalDescription
from PriceTerm 
where AdditionalDescription like '%[%]%'

Explication :

  1. Supprimer % en remplaçant par un espace
  2. Remplacer , avec .
  3. Supprimez tous les espaces de début ou de fin.
  4. Convertir en decimal(28, 10) .

Mise à jour :

Selon les informations supplémentaires fournies par OP.

Select 
convert(decimal(28,10),replace(replace(replace(rtrim(ltrim(AdditionalDescription)), ' ',''),',','.'),'%','')) AS PercentAddition
from test 
where replace(rtrim(ltrim(AdditionalDescription)), ' ','')
like '[0-9]%[,.]%[%0-9]'
and 
isnumeric(replace(replace(replace(rtrim(ltrim(AdditionalDescription)), ' ',''),',','.'),'%',''))=1

Explication de '[0-9]%[,.]%[%0-9]' :

  • [0-9] - Nous ne sommes intéressés que lorsque les données commencent par un chiffre.
  • % - Après le nombre, il peut contenir n'importe quel(s) caractère(s). Nous nous occupons des non-numériques avec isnumeric dans where clause.
  • [,.] - Nous avons les données pour avoir soit , ou . .
  • % - Après [,.] il peut contenir n'importe quel(s) caractère(s). Nous nous occupons des non-numériques avec isnumeric dans where clause.
  • [%0-9] - Nous voulons que les données se terminent soit par un chiffre soit par % .

Remarque : Vous devrez modifier '[0-9]%[,.]%[%0-9]' au fur et à mesure que vous trouvez plus de mauvais personnages.

Références :

  1. SQLFiddle pour jouer avec :http://sqlfiddle.com/#!3/09a34 /4
  2. LIKE - http://msdn.microsoft.com /en-us/library/ms179859(v=sql.90).aspx