Byłbym bardzo zaskoczony, gdybyś kiedykolwiek był w stanie wykryć jakąkolwiek różnicę między WHERE col LIKE '[0-9]'
i wszelkie inne metody, które wymyślisz. Ale zgadzam się z Denisem, odłóż to w funkcji, aby konsekwentnie używać tego samego sprawdzenia w całym kodzie (lub przynajmniej, jeśli unikasz UDF z powodu dużych skanów itp., umieść w kodzie znacznik, który będzie ułatwiają późniejsze zmiany na szeroką skalę).
To powiedziawszy, z pewnością zobaczysz większy spadek wydajności tylko przy użyciu skalarnego UDF niż metody używanej do analizowania wewnątrz funkcji. Naprawdę powinieneś porównać wydajność UDF z robieniem tego inline za pomocą CASE
. np.
SELECT Postal = CONVERT(INT, CASE WHEN SUBSTRING(postal,2,1) LIKE '[0-9]'
THEN SUBSTRING(postal, 2,1) END)
FROM ...
To da NULL
jeśli znak nie jest cyfrą.
Jeśli masz do czynienia tylko ze sprawdzaniem zmiennych lokalnych, to naprawdę nie ma znaczenia, jakiej metody parsowania używasz, i lepiej skoncentruj swoje wysiłki optymalizacyjne gdzie indziej.
EDYTUJ dodanie sugestii do zademonstrowanego JOIN
klauzula. Potencjalnie prowadzi to do mniej stałych skanowań, ale jest o wiele bardziej czytelne (znacznie mniej wywołań podciągów itp.):
;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);