Ще бъда много изненадан, ако някога успеете да откриете разлика между WHERE col LIKE '[0-9]'
и всякакви други методи, които измислите. Но съм съгласен с Денис, сложете това във функция, така че да използвате една и съща проверка последователно в целия си код (или поне, ако избягвате UDF поради големи сканирания и т.н., поставете маркер в кода си, който ще улесняват промяната в широк мащаб по-късно).
Въпреки това, вие със сигурност ще видите повече удар на производителността само чрез използване на скаларна UDF, отколкото метода, който използвате за анализиране във функцията. Наистина трябва да сравните производителността на UDF спрямо правенето на това вградено чрез CASE
. напр.
SELECT Postal = CONVERT(INT, CASE WHEN SUBSTRING(postal,2,1) LIKE '[0-9]'
THEN SUBSTRING(postal, 2,1) END)
FROM ...
Това ще доведе до NULL
ако знакът не е числов.
Ако се занимавате само с проверка на локални променливи, наистина няма да има значение какъв метод за анализиране използвате и е по-добре да съсредоточите усилията си за оптимизация другаде.
РЕДАКТИРАНЕ добавяне на предложение към демонстрирания JOIN
клауза. Това потенциално ще доведе до по-малко постоянни сканирания, но е много по-четливо (много по-малко извиквания на поднизове и т.н.):
;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);