Jeg ville blive meget overrasket, hvis du nogensinde ville være i stand til at opdage nogen forskel mellem WHERE col LIKE '[0-9]'
og andre metoder, du finder på. Men jeg er enig med Denis, læg det væk i en funktion, så du bruger den samme kontrol konsekvent gennem hele din kode (eller i det mindste, hvis du undgår UDF'er på grund af store scanninger osv., sæt en markør i din kode, der vil gør det nemt at ændre i stor skala senere).
Når det er sagt, vil du helt sikkert se mere af et præstationshit bare ved at bruge en skalar UDF end den metode, du bruger til at parse inde i funktionen. Du burde virkelig sammenligne ydeevnen af UDF'en med at gøre det inline ved hjælp af CASE
. f.eks.
SELECT Postal = CONVERT(INT, CASE WHEN SUBSTRING(postal,2,1) LIKE '[0-9]'
THEN SUBSTRING(postal, 2,1) END)
FROM ...
Dette vil give NULL
hvis tegnet ikke er numerisk.
Hvis du kun beskæftiger dig med at kontrollere lokale variabler, er det virkelig ligegyldigt, hvilken parsingmetode du bruger, og du er bedre stillet med at fokusere din optimeringsindsats andre steder.
REDIGER tilføjer forslag til demonstreret JOIN
klausul. Dette vil potentielt føre til mindre konstante scanninger, men er meget mere læsbart (langt færre understrengkald osv.):
;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);