Tänk inte på hur effektivt detta kommer att vara:
Select convert(decimal(28,10), rtrim(ltrim(replace(REPLACE(AdditionalDescription,'%',''), ',','.')))) As AdditionalDescription
from PriceTerm
where AdditionalDescription like '%[%]%'
Förklaring:
- Ta bort % genom att ersätta med blanksteg
- Ersätt
,med. - Ta bort alla inledande eller efterföljande mellanslag.
- Konvertera till
decimal(28, 10).
Uppdatering:
Enligt ytterligare information av 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
Förklaring av '[0-9]%[,.]%[%0-9]' :
[0-9]– Vi är bara intresserade när uppgifterna börjar med ett nummer.%- Efter numret kan det innehålla vilket tecken som helst. Vi tar hand om icke-numeriska medisnumericiwhereklausul.[,.]- Vi har data för att ha antingen,eller..%- Efter[,.]den kan innehålla vilket tecken som helst. Vi tar hand om icke-numeriska medisnumericiwhereklausul.[%0-9]- Vi vill att data ska sluta med antingen en siffra eller%.
Obs! Du måste ändra '[0-9]%[,.]%[%0-9]' när du hittar fler dåliga karaktärer.
Referenser:
- SQLFiddle att spela med:https://sqlfiddle.com/#!3/09a34 /4
LIKE- https://msdn.microsoft.com /en-us/library/ms179859(v=sql.90).aspx