Я был бы очень удивлен, если бы вы когда-нибудь смогли обнаружить разницу между 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);