Byl bych velmi překvapen, kdybyste někdy byli schopni zjistit jakýkoli rozdíl mezi WHERE col LIKE '[0-9]'
a jakékoli další metody, které vymyslíte. Ale souhlasím s Denisem, dejte to pryč do funkce, abyste používali stejnou kontrolu konzistentně v celém svém kódu (nebo alespoň, pokud se vyhýbáte UDF kvůli velkým skenům atd., vložte do kódu značku, která usnadnit pozdější změnu v širokém měřítku).
To znamená, že s největší pravděpodobností uvidíte větší zásah do výkonu pouze pomocí skalárního UDF než pomocí metody, kterou používáte k analýze uvnitř funkce. Opravdu byste měli porovnat výkon UDF s tím, že to děláte inline pomocí CASE
. např.
SELECT Postal = CONVERT(INT, CASE WHEN SUBSTRING(postal,2,1) LIKE '[0-9]'
THEN SUBSTRING(postal, 2,1) END)
FROM ...
Výsledkem bude NULL
pokud znak není číselný.
Pokud se zabýváte pouze kontrolou místních proměnných, opravdu nezáleží na tom, jakou metodu analýzy použijete, a je lepší zaměřit své optimalizační úsilí jinam.
UPRAVIT přidání návrhu k demonstrovanému JOIN
doložka. To potenciálně povede k méně konstantnímu skenování, ale je mnohem čitelnější (mnohem méně volání podřetězců atd.):
;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);