Jag skulle bli mycket förvånad om du någonsin skulle kunna upptäcka någon skillnad mellan WHERE col LIKE '[0-9]'
och alla andra metoder du kommer på. Men jag håller med Denis, lägg bort det i en funktion så att du använder samma kontroll konsekvent genom hela din kod (eller åtminstone, om du undviker UDFs på grund av stora skanningar etc., sätt en markör i din kod som kommer att gör det enkelt att ändra i stor skala senare).
Som sagt, du kommer säkerligen att se mer av en prestandaträff bara genom att använda en skalär UDF än vilken metod du använder för att analysera inuti funktionen. Du borde verkligen jämföra UDF:s prestanda med att göra det inline med CASE
. t.ex.
SELECT Postal = CONVERT(INT, CASE WHEN SUBSTRING(postal,2,1) LIKE '[0-9]'
THEN SUBSTRING(postal, 2,1) END)
FROM ...
Detta kommer att ge NULL
om tecknet inte är numeriskt.
Om du bara har att göra med att kontrollera lokala variabler kommer det verkligen inte att spela någon roll vilken analysmetod du använder, och det är bättre att fokusera dina optimeringsinsatser någon annanstans.
REDIGERA lägger till förslag till demonstrerad JOIN
klausul. Detta kommer potentiellt att leda till mindre konstanta genomsökningar men är mycket mer läsbart (mycket färre anrop till delsträngar etc):
;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);