Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Localizar valores não numéricos em uma coluna no SQL Server


Pode haver ocasiões em que você precise verificar uma coluna para valores não numéricos. Por exemplo, você descobre que uma coluna é um varchar coluna quando realmente deveria ser uma coluna numérica.

Isso é feito facilmente no SQL Server com o ISNUMERIC() função.

Dados de amostra


Suponha que criamos uma tabela com um varchar coluna e insira os dados da seguinte forma:
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (
    c1 varchar(255)
);

INSERT INTO t1 (c1) VALUES 
    ('0'),
    ('1'),
    ('+1'),
    ('-1'),
    ('+1'),
    ('00.00'),
    ('73.45'),
    ('+73.45'),
    ('-73.45'),
    ('.246'),
    ('-.34e7'),
    ('12.e-3'),
    ('1.2e+4'),
    ('a'),
    ('9afc'),
    ('e7'),
    ('+e0'),
    ('Ten'),
    ('5 Dollars');

SELECT * FROM t1;

Resultado:
+-----------+
| c1        |
|-----------|
| 0         |
| 1         |
| +1        |
| -1        |
| +1        |
| 00.00     |
| 73.45     |
| +73.45    |
| -73.45    |
| .246      |
| -.34e7    |
| 12.e-3    |
| 1.2e+4    |
| a         |
| 9afc      |
| e7        |
| +e0       |
| Ten       |
| 5 Dollars |
+-----------+

A maioria dos valores acima são numéricos, embora estejam em um varchar coluna. Os exemplos a seguir verificam esta coluna para valores não numéricos.

O ISNUMERIC() Função

SELECT c1
FROM t1
WHERE ISNUMERIC(c1) <> 1;

Resultado:
+-----------+
| c1        |
|-----------|
| a         |
| 9afc      |
| e7        |
| +e0       |
| Ten       |
| 5 Dollars |
+-----------+

Aqui, usei o ISNUMERIC() função junto com o Not Equal To (<> ) para verificar valores que não são numéricos.

Pode haver uma boa razão para uma coluna ser varchar em vez de numérico. Mas se não, os valores devem ser convertidos em seus equivalentes numéricos e, em seguida, o tipo de dados da coluna deve ser alterado para um tipo numérico. Isso ajudará a manter a integridade dos dados do banco de dados.

Encontre valores que não contenham números


Podemos usar a seguinte consulta para retornar todas as linhas que não contêm valores numéricos.
SELECT c1
FROM t1 
WHERE c1 NOT LIKE '%[0-9]%';

Resultado:
+------+
| c1   |
|------|
| a    |
| Ten  |
+------+

Este é um resultado diferente do exemplo anterior, porque estamos simplesmente procurando por todos os valores que não contêm qualquer dado numérico. No exemplo anterior, estávamos procurando os valores que não são numéricos.