sql >> Base de Datos >  >> RDS >> Sqlserver

¿La forma más rápida de verificar si un carácter es un dígito?

Me sorprendería mucho si alguna vez pudieras detectar alguna diferencia entre WHERE col LIKE '[0-9]' y cualquier otro método que se te ocurra. Pero estoy de acuerdo con Denis, guarde eso en una función para que use la misma verificación de manera consistente en todo su código (o al menos, si está evitando UDF debido a escaneos grandes, etc., coloque un marcador en su código que lo hará facilitar el cambio a gran escala más adelante).

Dicho esto, seguramente verá más un impacto en el rendimiento simplemente usando un UDF escalar que el método que usa para analizar dentro de la función. Realmente debería comparar el rendimiento de UDF con hacerlo en línea usando CASE . por ejemplo

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

Esto producirá NULL si el carácter no es numérico.

Si solo se trata de verificar variables locales, realmente no importará qué método de análisis utilice, y es mejor que centre sus esfuerzos de optimización en otra parte.

EDITAR agregando sugerencia para demostrar JOIN cláusula. Esto conducirá potencialmente a exploraciones menos constantes, pero es mucho más legible (muchas menos llamadas a subcadenas, 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);