Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Caractères non numériques qui retournent positifs lors de l'utilisation de ISNUMERIC() dans SQL Server

Le ISNUMERIC() La fonction dans SQL Server vous permet de vérifier si une expression est numérique ou non.

Cependant, il peut arriver que vous obteniez des résultats auxquels vous ne vous attendiez pas. Cela peut arriver si vous avez une expression qui contient un caractère qui n'est pas un nombre, mais qui est toujours accepté par ISNUMERIC() comme étant numérique.

Il y a un tas de caractères qui ISNUMERIC() accepte comme numérique ce que vous n'auriez peut-être pas pensé comme numérique. Ceux-ci incluent des caractères tels que plus (+ ), moins (- ) et les différents symboles monétaires. Aussi, selon son emplacement, la lettre e pourrait également permettre à l'expression entière d'être interprétée comme numérique.

Exemples

Voici quelques exemples de ce que je veux dire :

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+];

Résultat :

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

Notez que le e et e+ renvoient un résultat négatif lorsqu'ils sont seuls, mais renvoient un résultat positif lorsqu'ils sont entourés de chiffres.

C'est probablement parce que, seuls, ils ne représentent pas un nombre, mais lorsqu'ils sont entourés de nombres, l'expression entière pourrait être interprétée comme une notation scientifique (e et e+ sont souvent utilisés en notation scientifique).

Types de données numériques

Selon la documentation Microsoft, les types de données qui ISNUMERIC() reconnaîtra comme numérique les éléments suivants.

Chiffres exacts

  • bigint
  • entier
  • smallint
  • minuscule
  • bit

Précision fixe

  • décimal
  • numérique

Approximatif

  • flotter
  • réel

Valeurs monétaires

  • l'argent
  • petite monnaie

De plus, ISNUMERIC() renvoie 1 pour certains caractères qui ne sont pas des nombres (comme dans l'exemple ci-dessus). Cela inclut des caractères tels que plus (+ ), moins (- ) et des symboles monétaires valides tels que le signe dollar ($ ).

Aussi, comme on le voit dans l'exemple, la lettre e peut affecter le résultat lorsqu'il fait partie d'une expression plus grande, et selon son emplacement dans cette expression.