Het zou me verbazen als je ooit enig verschil zou kunnen ontdekken tussen WHERE col LIKE '[0-9]'
en alle andere methoden die u bedenkt. Maar ik ben het met Denis eens, stop dat weg in een functie zodat je dezelfde controle consequent in al je code gebruikt (of tenminste, als je UDF's vermijdt vanwege grote scans enz., plaats dan een markering in je code die zal maken het later gemakkelijk om op grote schaal te veranderen).
Dat gezegd hebbende, je zult zeker meer een prestatiehit zien door alleen een scalaire UDF te gebruiken dan welke methode je gebruikt om in de functie te parseren. Je zou echt de prestaties van de UDF moeten vergelijken met dat inline doen met CASE
. bijv.
SELECT Postal = CONVERT(INT, CASE WHEN SUBSTRING(postal,2,1) LIKE '[0-9]'
THEN SUBSTRING(postal, 2,1) END)
FROM ...
Dit levert NULL
. op als het teken niet numeriek is.
Als u zich alleen bezighoudt met het controleren van lokale variabelen, maakt het echt niet uit welke ontledingsmethode u gebruikt, en kunt u uw optimalisatie-inspanningen beter ergens anders concentreren.
BEWERKEN suggestie toevoegen aan gedemonstreerde JOIN
clausule. Dit zal mogelijk leiden tot minder constante scans, maar is veel leesbaarder (veel minder substring-aanroepen enz.):
;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);