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 comisnumeric
emwhere
cláusula.[,.]
- Temos os dados para ter,
ou.
.%
- Após[,.]
pode conter qualquer caractere(s). Cuidamos do não numérico comisnumeric
emwhere
clá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:http://sqlfiddle.com/#!3/09a34 /4
LIKE
- http://msdn.microsoft.com /en-us/library/ms179859(v=sql.90).aspx