Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak rzutować podciąg SQL na dziesiętny?

Nie zastanawiaj się, jak będzie to wydajne:

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

Wyjaśnienie:

  1. Usuń %, zastępując spacją
  2. Zastąp , z .
  3. Usuń wszelkie spacje wiodące i końcowe.
  4. Konwertuj na decimal(28, 10) .

Aktualizacja:

Zgodnie z dodatkowymi informacjami 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

Wyjaśnienie '[0-9]%[,.]%[%0-9]' :

  • [0-9] - Interesuje nas tylko wtedy, gdy dane zaczynają się od liczby.
  • % - Po liczbie może zawierać dowolne znaki. Dbamy o nienumeryczne z isnumeric w where klauzula.
  • [,.] - Mamy dane do przechowywania , lub . .
  • % - Po [,.] może zawierać dowolne znaki. Dbamy o nienumeryczne z isnumeric w where klauzula.
  • [%0-9] - Chcemy, aby dane kończyły się cyfrą lub % .

Uwaga: Będziesz musiał zmodyfikować '[0-9]%[,.]%[%0-9]' gdy znajdziesz więcej złych postaci.

Referencje:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy utrata wydajności przechwytywania zmian danych jest ograniczona do tabel obsługujących funkcję CDC?

  2. Czy istnieje odpowiednik .NET do newsekwencjonowania () SQL Server'a

  3. Jak używać parametru z LIKE w Sql Server Compact Edition

  4. SQL Unpivot wiele kolumn Dane

  5. Ile indeksów klastrowych może znajdować się w jednej tabeli?