none
conversão para float p/ isnumeric RRS feed

  • Pergunta

  • estou carregando um arquivo txt. nele existe um campo valor. nele existem valores igual a ' -   '.

    eu carrego o arquivo todo. e aí quando vou fazer o select da minha tabela, quero pegar todos os valores onde seja diferente de ' -   '. aí poderia fazer:

    select CAST(REPLACE(REPLACE(valor ,'.',''),',','.') AS FLOAT), * from #tabela
    WHERE ISNUMERIC(CAST(valor AS FLOAT)) = 1

    porém, isso não funciona porque estou tentando converter  ' -   ' em numero. e isso não é válido. porém, também não posso simplesmente fazer where valor <>  ' -   '. porque afetaria outros arquivo que tenho q ler.

    o que eu queria é fazer uma coisa mais ou menos assim: where isnumeric(valor)  = 1. aí me traria só valor que numérico.

    terça-feira, 26 de março de 2013 17:50

Respostas

  • Rafa,

    Isso, exatamente esses dados, sem os mesmos eu posso gerar um script que não condiz com a sua realidade.

    Segue abaixo um script que trata este problema.

    IF(OBJECT_ID('TabelaRafa') IS NOT NULL)
    	DROP TABLE TabelaRafa
    
    CREATE TABLE TabelaRafa
    (
    	Texto	VARCHAR(100)
    )
    
    INSERT INTO TabelaRafa(Texto)
    VALUES
    ('5487747444'),
    ('1877444,35'),
    (' -   ')
    
    SELECT CAST(RTRIM(LTRIM(REPLACE(REPLACE(REPLACE(REPLACE(Texto, '.', 'a'), ',', 'B'), 'a', ','), 'b', '.'))) AS DECIMAL(18,2))
    FROM TabelaRafa
    WHERE ISNUMERIC(RTRIM(LTRIM(REPLACE(REPLACE(REPLACE(REPLACE(Texto, '.', 'a'), ',', 'B'), 'a', ','), 'b', '.')))) = 1
    AND LEN(REPLACE(RTRIM(LTRIM(REPLACE(REPLACE(REPLACE(REPLACE(Texto, '.', 'a'), ',', 'B'), 'a', ','), 'b', '.'))), '-', '')) > 0


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com

    • Marcado como Resposta rafa-martin terça-feira, 26 de março de 2013 18:29
    terça-feira, 26 de março de 2013 18:20
    Moderador

Todas as Respostas

  • Rafa,

    Não entendi, aonde esta o sinal "-" no seu texto? Poste uma massa dos seus dados originais e como gostaria que eles viessem (Cuidado com a formatação ao postar os dados.)


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com

    terça-feira, 26 de março de 2013 17:53
    Moderador
  • esse sinal vem no arquivo que está em um local da rede. apara carregar faço um bulk.

    acontece que preciso fazer alguns tratamentos. só que como esse é uma string, não consigo fazer o tratamento que quero mais outros registros que são números. por exemplo: tenho um tabela com a coluna valor do tipo float. aí quero inserir os registro da coluna que está no arquivo nessa tabela. então o que eu faria:

    insert into tabela (valor) select cast(replace(replace(valor1 ,'.',''),',','.') as float)from #tabela_bulk 

    só que quando chegasse na linha do arquivo que tem o sinal daria erro, dizendo que não pode converter um varchar em float.

    por isso precisaria fazer por exemplo algo mais ou menos assim: 

    insert into tabela (valor) select cast(replace(replace(valor1 ,'.',''),',','.') as float)from #tabela_bulk  where isnumeric(valor1) = 1. essa forma também não daria, mais é mais ou menos o que teria que ser feito.

    entendeu?

    terça-feira, 26 de março de 2013 18:05
  • Rafa,

    Entendi sim. Poste os dados para te ajudar melhor.


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com

    terça-feira, 26 de março de 2013 18:06
    Moderador
  • q dados? cara é assim: o arquivo tem esses valores:

    5487747444

    1877444,35

     -   

    é isso que vem no arquivo. aí faço um bulk numa tabela temporaria. ao final, na minha tabela tenho esses valores. aí preciso fazer o que disse acima? ou seja, preciso trazer os dois primeiros registros sem fazer no where valor <> ' - '. preciso fazer uma coisa mais genérica. do tipo isnumeric.

    terça-feira, 26 de março de 2013 18:13
  • Rafa,

    Isso, exatamente esses dados, sem os mesmos eu posso gerar um script que não condiz com a sua realidade.

    Segue abaixo um script que trata este problema.

    IF(OBJECT_ID('TabelaRafa') IS NOT NULL)
    	DROP TABLE TabelaRafa
    
    CREATE TABLE TabelaRafa
    (
    	Texto	VARCHAR(100)
    )
    
    INSERT INTO TabelaRafa(Texto)
    VALUES
    ('5487747444'),
    ('1877444,35'),
    (' -   ')
    
    SELECT CAST(RTRIM(LTRIM(REPLACE(REPLACE(REPLACE(REPLACE(Texto, '.', 'a'), ',', 'B'), 'a', ','), 'b', '.'))) AS DECIMAL(18,2))
    FROM TabelaRafa
    WHERE ISNUMERIC(RTRIM(LTRIM(REPLACE(REPLACE(REPLACE(REPLACE(Texto, '.', 'a'), ',', 'B'), 'a', ','), 'b', '.')))) = 1
    AND LEN(REPLACE(RTRIM(LTRIM(REPLACE(REPLACE(REPLACE(REPLACE(Texto, '.', 'a'), ',', 'B'), 'a', ','), 'b', '.'))), '-', '')) > 0


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com

    • Marcado como Resposta rafa-martin terça-feira, 26 de março de 2013 18:29
    terça-feira, 26 de março de 2013 18:20
    Moderador
  • blz. é mais ou menos isso que precisava. adaptei.

    valeu! 

    terça-feira, 26 de março de 2013 18:29