[2011-04-02] Código completo:
DECLARE @TEXTO VARCHAR(8000) SET @TEXTO = 'Yield 96%, white crystals, mp 104 °C (acetonitrile). δH (DMSO-d6): 5.40 (1H, s, H-2), 6.54 (2H, d, J45=J89=7.8 Hz, H-4, H-9), 7.02 (2H, d, J56=J78=8.0 Hz' DECLARE @RESULTADO VARCHAR (8000), @LETRA CHAR(1), @NUMERO INT, @CONT INT, @ZERO INT, @NOVE INT SELECT @RESULTADO = '', @CONT = 0, @ZERO = UNICODE(0), @NOVE = UNICODE(9), @NUMERO = LEN(@TEXTO) WHILE @CONT < @NUMERO BEGIN SET @CONT = @CONT + 1 SET @LETRA = SUBSTRING(@TEXTO, @CONT, 1) IF UNICODE(@LETRA) BETWEEN @ZERO AND @NOVE BEGIN SET @RESULTADO = @RESULTADO + @LETRA END END SELECT @RESULTADO
[2011-04-02] Código completo v2:
DECLARE @TEXTO VARCHAR(8000) SET @TEXTO = 'Yield 96%, white crystals, mp 104 °C (acetonitrile). δH (DMSO-d6): 5.40 (1H, s, H-2), 6.54 (2H, d, J45=J89=7.8 Hz, H-4, H-9), 7.02 (2H, d, J56=J78=8.0 Hz' DECLARE @RESULTADO VARCHAR (8000), @LETRA CHAR(1), @NUMERO INT, @CONT INT SELECT @RESULTADO = '', @CONT = 0, @NUMERO = LEN(@TEXTO) WHILE @CONT < @NUMERO BEGIN SET @CONT = @CONT + 1 SET @LETRA = SUBSTRING(@TEXTO, @CONT, 1) IF @LETRA LIKE '[0-9]' BEGIN SET @RESULTADO = @RESULTADO + @LETRA END END SELECT @RESULTADO
[Post-Original] Explicação:
Boa noite pessoal!
Para filtrar um texto, deixando somente os valores numéricos, pensei em realizar de duas formas, a primeira com WHILE e outra com CTE, mas como CTE se torna um pouco complexo para alguns, vou começar com WHILE:
Primeiro tenho meu texto, no caso estou utilizando a variável @PALAVRAS com um texto que encontrei na internet.
DECLARE @PALAVRA VARCHAR(8000) SET @PALAVRA = 'Yield 96%, white crystals, mp 104 °C (acetonitrile). δH (DMSO-d6): 5.40 (1H, s, H-2), 6.54 (2H, d, J45=J89=7.8 Hz, H-4, H-9), 7.02 (2H, d, J56=J78=8.0 Hz'
Tendo o texto, vou definir quais as variáveis que vou utilizar, assim tenho uma variável onde salvarei o resultado (@RESULTADO) da operação, uma variável para armazenar uma a uma as ’letras’ (@LETRA) da operação, uma variável para saber quantas ‘letras’ tenho no texto (@NUMERO) e outra para controle dos ‘loops’ da operação (@CONT).
DECLARE @RESULTADO VARCHAR (8000), @LETRA CHAR(1), @NUMERO INT, @CONT INT, @ZERO INT, @NOVE INT
Esqueci de dizem que é @ZERO e @NOVE, bem… elas irão armazenar os valores que identifica range inicial e final dos valores numéricos, no caso 0 (zero) e o 9 (nove) respectivamente. A função UNICODE retorna o ‘valor decimal’ de um determinado caractere.
Uma observação importante é o valor inicial de @RESULTADO, pois como o valor inicial das variáveis é NULL, NULL somado a qualquer outros valor, nas configurações padrões do T-SQL, tem como resultado NULL, então precisamos estipular o valor inicial dele, assim como das outras variáveis.
SELECT @RESULTADO = '', @CONT = 0, @ZERO = UNICODE(0), @NOVE = UNICODE(9), @NUMERO = LEN(@PALAVRA)
Vamos agora ao laço de repetição, que percorrerá uma a uma as letras.
WHILE @CONT < @NUMERO BEGIN SET @CONT = @CONT + 1 SET @LETRA = SUBSTRING(@PALAVRA, @CONT, 1)
Agora temos a validação, onde verifico se a variável @LETRA esta em 0 (zero) e 9 (nove). Utilizando novamente a função UNICODE, que retorna o ‘valor decimal’ de um caractere.
IF UNICODE(@LETRA) BETWEEN @ZERO AND @NOVE BEGIN SET @RESULTADO = @RESULTADO + @LETRA END END
Agora temos a primeira solução. No próximo artigo estarei detalhando a forma de realizar esta operação com CTE.
Artigos relacionados:
FUNÇÕES: Somente Números (com CTE):
http://sqlfromhell.wordpress.com/2009/11/18/somente-numeros-com-cte/
Perfeito sql, funcionou como eu queria! Parabens pela explicação e código!