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

Caracteres não numéricos que retornam positivos ao usar ISNUMERIC() no SQL Server


O ISNUMERIC() A função no SQL Server permite verificar se uma expressão é numérica ou não.

No entanto, pode haver momentos em que você obtém resultados que não esperava. Isso pode acontecer se você tiver uma expressão que contenha um caractere que não seja um número, mas ainda seja aceito por ISNUMERIC() como sendo numérico.

Existem vários caracteres que ISNUMERIC() aceita como numérico que você pode não ter pensado como numérico. Estes incluem caracteres como mais (+ ), menos (- ) e os vários símbolos de moeda. Além disso, dependendo de seu posicionamento, a letra e também pode permitir que toda a expressão seja interpretada como numérica.


Exemplos


Aqui estão alguns exemplos do que quero dizer:
SELECT 
  ISNUMERIC('+') AS [+],
  ISNUMERIC('-') AS [-],
  ISNUMERIC('$') AS [$],
  ISNUMERIC('1e2') AS [1e2],
  ISNUMERIC('1e+2') AS [1e+2],
  ISNUMERIC('e') AS [e],
  ISNUMERIC('e+') AS [e+];

Resultado:
+-----+-----+-----+-------+--------+-----+------+
| +   | -   | $   | 1e2   | 1e+2   | e   | e+   |
|-----+-----+-----+-------+--------+-----+------|
| 1   | 1   | 1   | 1     | 1      | 0   | 0    |
+-----+-----+-----+-------+--------+-----+------+

Observe que o e e e+ retornam um resultado negativo quando estão sozinhos, mas retornam um resultado positivo quando cercados por números.

Isso provavelmente ocorre porque, por si só, eles não representam um número, mas quando cercados por números, toda a expressão pode ser interpretada como notação científica (e e e+ são frequentemente usados ​​em notação científica).

Tipos de dados numéricos


De acordo com a documentação da Microsoft, os tipos de dados que ISNUMERIC() reconhecerá como numérico incluem o seguinte.

Números exatos

  • grande
  • int
  • pequeno
  • tinyint
  • bit

Precisão fixa

  • decimais
  • numérico

Aproximado

  • flutuar
  • real

Valores monetários

  • dinheiro
  • dinheiro pequeno

Além disso, ISNUMERIC() retorna 1 para alguns caracteres que não são números (como visto no exemplo acima). Isso inclui caracteres como mais (+ ), menos (- ) e símbolos de moeda válidos, como o cifrão ($ ).

Além disso, como visto no exemplo, a letra e pode afetar o resultado quando faz parte de uma expressão maior e dependendo de seu posicionamento nessa expressão.