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

Maneira mais rápida de verificar se um caractere é um dígito?


Eu ficaria muito surpreso se você pudesse detectar qualquer diferença entre WHERE col LIKE '[0-9]' e quaisquer outros métodos que você inventar. Mas eu concordo com Denis, coloque isso em uma função para que você use a mesma verificação consistentemente em todo o seu código (ou pelo menos, se você estiver evitando UDFs por causa de grandes varreduras etc., coloque um marcador em seu código que facilitar a mudança em larga escala posteriormente).

Dito isso, você certamente verá mais um impacto no desempenho apenas usando uma UDF escalar do que o método usado para analisar dentro da função. Você realmente deve comparar o desempenho da UDF versus fazer isso inline usando CASE . por exemplo.
SELECT Postal = CONVERT(INT, CASE WHEN SUBSTRING(postal,2,1) LIKE '[0-9]' 
       THEN SUBSTRING(postal, 2,1) END)
FROM ...

Isso produzirá NULL se o caractere não for numérico.

Se você está lidando apenas com a verificação de variáveis ​​locais, realmente não importa qual método de análise você usa, e é melhor concentrar seus esforços de otimização em outro lugar.

EDITAR adicionando sugestão ao JOIN demonstrado cláusula. Isso potencialmente levará a varreduras menos constantes, mas é muito mais legível (muito menos chamadas de substring, 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);