मुझे बहुत आश्चर्य होगा यदि आप कभी भी WHERE col LIKE '[0-9]'
के बीच किसी भी अंतर का पता लगाने में सक्षम होंगे। और कोई अन्य तरीका जो आप अपनाते हैं। लेकिन मैं डेनिस से सहमत हूं, इसे एक फ़ंक्शन में रखें ताकि आप अपने सभी कोड में लगातार एक ही चेक का उपयोग करें (या कम से कम, यदि आप बड़े स्कैन आदि के कारण यूडीएफ से बच रहे हैं, तो अपने कोड में एक मार्कर लगाएं जो होगा बाद में इसे व्यापक पैमाने पर बदलना आसान बनाएं).
उस ने कहा, आप निश्चित रूप से फ़ंक्शन के अंदर पार्स करने के लिए उपयोग की जाने वाली विधि की तुलना में स्केलर यूडीएफ का उपयोग करके अधिक प्रदर्शन हिट देखने जा रहे हैं। आपको वास्तव में CASE
. का उपयोग करके UDF बनाम उस इनलाइन के प्रदर्शन की तुलना करनी चाहिए . उदा.
SELECT Postal = CONVERT(INT, CASE WHEN SUBSTRING(postal,2,1) LIKE '[0-9]'
THEN SUBSTRING(postal, 2,1) END)
FROM ...
इससे NULL
प्राप्त होगा यदि वर्ण अंकीय नहीं है।
यदि आप केवल स्थानीय चरों की जांच के साथ काम कर रहे हैं, तो इससे कोई फर्क नहीं पड़ता कि आप किस पार्सिंग विधि का उपयोग करते हैं, और आप अपने अनुकूलन प्रयासों को कहीं और केंद्रित करने से बेहतर हैं।
संपादित करें प्रदर्शन के लिए सुझाव जोड़ना JOIN
खंड। यह संभावित रूप से कम निरंतर स्कैन की ओर ले जाएगा, लेकिन बहुत अधिक पठनीय है (बहुत कम सबस्ट्रिंग कॉल आदि):
;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);