Não se preocupe com o quão eficiente isso será:
Select convert(decimal(28,10), rtrim(ltrim(replace(REPLACE(AdditionalDescription,'%',''), ',','.')))) As AdditionalDescription
from PriceTerm
where AdditionalDescription like '%[%]%'
Explicação:
- Remova % substituindo por espaço
- Substituir
,com. - Remova quaisquer espaços à esquerda ou à direita.
- Converter para
decimal(28, 10).
Atualização:
Conforme informações adicionais do 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
Explicação de
'[0-9]%[,.]%[%0-9]' :[0-9]- Estamos interessados apenas quando os dados começam com um número.%- Após o número pode conter qualquer caractere(s). Cuidamos do não numérico comisnumericemwherecláusula.[,.]- Temos os dados para ter,ou..%- Após[,.]pode conter qualquer caractere(s). Cuidamos do não numérico comisnumericemwherecláusula.[%0-9]- Queremos que os dados terminem com um dígito ou%.
Observação: Você terá que modificar
'[0-9]%[,.]%[%0-9]' à medida que você encontra mais personagens ruins. Referências:
- SQLFiddle para brincar:https://sqlfiddle.com/#!3/09a34 /4
LIKE- https://msdn.microsoft.com /en-us/library/ms179859(v=sql.90).aspx