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);