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

Le moyen le plus rapide de vérifier si un caractère est un chiffre ?

Je serais très surpris si vous pouviez un jour détecter une différence entre WHERE col LIKE '[0-9]' et toutes les autres méthodes que vous proposez. Mais je suis d'accord avec Denis, mettez cela dans une fonction afin que vous utilisiez la même vérification de manière cohérente dans tout votre code (ou du moins, si vous évitez les UDF à cause de grandes analyses, etc., mettez un marqueur dans votre code qui sera faciliter le changement à grande échelle ultérieurement).

Cela dit, vous allez certainement voir plus d'impact sur les performances simplement en utilisant un UDF scalaire que la méthode que vous utilisez pour analyser à l'intérieur de la fonction. Vous devriez vraiment comparer les performances de l'UDF par rapport à cela en ligne en utilisant CASE . ex.

SELECT Postal = CONVERT(INT, CASE WHEN SUBSTRING(postal,2,1) LIKE '[0-9]' 
       THEN SUBSTRING(postal, 2,1) END)
FROM ...

Cela donnera NULL si le caractère n'est pas numérique.

Si vous ne vous occupez que de la vérification des variables locales, la méthode d'analyse que vous utilisez n'aura pas vraiment d'importance, et vous feriez mieux de concentrer vos efforts d'optimisation ailleurs.

MODIFIER ajout d'une suggestion à la démonstration de JOIN clause. Cela conduira potentiellement à des analyses moins constantes, mais est beaucoup plus lisible (beaucoup moins d'appels de sous-chaînes, etc.) :

;WITH v AS 
(
    SELECT /* other columns, */ patientPostal, 
      ss = SUBSTRING(v.patientPostal,2,1),
      FROM [whatever table is aliased v in current query]
)
SELECT /* column list */
FROM [whatever table is aliased z in current query]
INNER JOIN v ON z.postal = CONVERT(INT, CASE 
    WHEN v.ss = '0' THEN ss
    WHEN v.ss LIKE '[1-9]' THEN LEFT(v.patientPostal, 3)
END);