Sarei molto sorpreso se riuscissi mai a rilevare una differenza tra WHERE col LIKE '[0-9]'
e qualsiasi altro metodo che ti viene in mente. Ma sono d'accordo con Denis, mettilo via in una funzione in modo da utilizzare lo stesso controllo in modo coerente in tutto il tuo codice (o almeno, se stai evitando le UDF a causa di scansioni di grandi dimensioni ecc., metti un marcatore nel tuo codice che lo farà semplificare la modifica su larga scala in un secondo momento).
Detto questo, vedrai sicuramente più di un calo delle prestazioni semplicemente usando un UDF scalare rispetto al metodo che usi per analizzare all'interno della funzione. Dovresti davvero confrontare le prestazioni dell'UDF con quelle eseguite in linea usando CASE
. es.
SELECT Postal = CONVERT(INT, CASE WHEN SUBSTRING(postal,2,1) LIKE '[0-9]'
THEN SUBSTRING(postal, 2,1) END)
FROM ...
Questo produrrà NULL
se il carattere non è numerico.
Se hai a che fare solo con il controllo delle variabili locali, non avrà importanza quale metodo di analisi utilizzi e farai meglio a concentrare i tuoi sforzi di ottimizzazione altrove.
MODIFICA aggiunta di un suggerimento alla dimostrazione di JOIN
clausola. Ciò porterà potenzialmente a scansioni meno costanti ma è molto più leggibile (molte meno chiamate di sottostringhe ecc.):
;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);