Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर प्रतिस्थापन () बनाम अनुवाद ():अंतर क्या हैं?

SQL सर्वर 2017 से शुरू करके, अब आप T-SQL TRANSLATE() . का उपयोग कर सकते हैं वर्णों के दूसरे सेट में एक या अधिक वर्णों का अनुवाद करने के लिए कार्य करता है।

पहली नज़र में, आप सोच सकते हैं कि TRANSLATE() फ़ंक्शन ठीक वैसा ही काम करता है जैसे REPLACE() कार्य करते हैं, लेकिन दोनों के बीच महत्वपूर्ण अंतर हैं।

परिभाषाएं

सबसे पहले, आइए प्रत्येक फ़ंक्शन की परिभाषा देखें:

REPLACE()
एक निर्दिष्ट स्ट्रिंग मान की सभी आवृत्तियों को दूसरे स्ट्रिंग मान से बदल देता है।
TRANSLATE()
दूसरे तर्क में निर्दिष्ट कुछ वर्णों के वर्णों के गंतव्य सेट में अनुवाद किए जाने के बाद पहले तर्क के रूप में प्रदान की गई स्ट्रिंग लौटाता है।

मुख्य अंतर यह है कि प्रत्येक फ़ंक्शन एकाधिक वर्णों से कैसे निपटता है। REPLACE() एक स्ट्रिंग को दूसरी स्ट्रिंग से बदल देता है। इसलिए, यदि एक स्ट्रिंग में कई वर्ण हैं, तो प्रत्येक वर्ण समान क्रम में होना चाहिए। TRANSLATE() दूसरी ओर, उन वर्णों के क्रम की परवाह किए बिना, प्रत्येक वर्ण को एक-एक करके बदल देता है।

उदाहरण - समान परिणाम

ऐसे कुछ मामले हैं जहां दोनों कार्य एक ही परिणाम लौटाएंगे। इस तरह:

SELECT 
    REPLACE('123', '123', '456') AS Replace,
    TRANSLATE('123', '123', '456') AS Translate;

परिणाम:

Replace  Translate
-------  ---------
456      456      

इस मामले में, REPLACE() रिटर्न 456 क्योंकि दूसरे तर्क में सटीक स्ट्रिंग पहले तर्क में एक स्ट्रिंग से मेल खाती है (इस मामले में, यह पूरी स्ट्रिंग थी)।

TRANSLATE() रिटर्न 456 क्योंकि दूसरे तर्क में प्रत्येक वर्ण पहले तर्क में मौजूद है।

उदाहरण - भिन्न परिणाम

अब एक उदाहरण के लिए जो TRANSLATE() . के बीच के अंतरों में से एक को प्रदर्शित करता है और REPLACE() :

SELECT 
    REPLACE('123', '321', '456') AS Replace,
    TRANSLATE('123', '321', '456') AS Translate;

परिणाम:

Replace  Translate
-------  ---------
123      654      

इस मामले में, REPLACE() इसका कोई प्रभाव नहीं है (यह मूल स्ट्रिंग देता है) क्योंकि दूसरा तर्क पहले तर्क (या इसके भीतर एक सबस्ट्रिंग) के लिए सटीक मिलान नहीं है। भले ही दूसरे तर्क में सही वर्ण हों, लेकिन वे पहले तर्क के समान क्रम में नहीं हैं, और इसलिए, पूरी स्ट्रिंग मेल नहीं खाती।

TRANSLATE() करता है एक प्रभाव है क्योंकि दूसरे तर्क में प्रत्येक वर्ण पहले तर्क में मौजूद है। इससे कोई फर्क नहीं पड़ता कि वे एक अलग क्रम में हैं, क्योंकि प्रत्येक चरित्र का एक-एक करके अनुवाद किया जाता है। SQL सर्वर पहले अक्षर का अनुवाद करता है, फिर दूसरे, फिर तीसरे, और इसी तरह।

गैर-सन्निहित स्ट्रिंग्स

पिछले उदाहरण के समान, आप भी अलग-अलग परिणाम प्राप्त कर सकते हैं जब पहले तर्क में दूसरे तर्क में वर्ण होते हैं, लेकिन वे गैर-सन्निहित होते हैं:

SELECT 
    REPLACE('1car23', '123', '456') AS Replace,
    TRANSLATE('1car23', '123', '456') AS Translate;

परिणाम:

Replace  Translate
-------  ---------
1car23   4car56   

विभिन्न लंबाई के तर्क

जब भी विभिन्न तर्कों में वर्णों की संख्या में विसंगतियां हों, तो आपको प्रत्येक फ़ंक्शन के बीच अलग-अलग परिणाम भी मिल सकते हैं।

यहां एक उदाहरण दिया गया है जहां पहले तर्क में दूसरे और तीसरे तर्क की तुलना में कम वर्ण हैं:

SELECT 
    REPLACE('123', '1234', '4567') AS Replace,
    TRANSLATE('123', '1234', '4567') AS Translate;

परिणाम:

Replace  Translate
-------  ---------
123      456      

इस मामले में, REPLACE() इसका कोई प्रभाव नहीं है क्योंकि दूसरे तर्क में पहले तर्क की तुलना में अधिक वर्ण हैं। इसलिए, पहले तर्क में दूसरे तर्क को शामिल करना असंभव है।

TRANSLATE() हालांकि, इस मामले में कार्य का प्रभाव पड़ता है। ऐसा इसलिए है क्योंकि दूसरे तर्क में ऐसे वर्ण हैं जो पहले तर्क में हैं। इससे कोई फर्क नहीं पड़ता कि दूसरे तर्क में पहले की तुलना में अधिक वर्ण हैं। सबसे महत्वपूर्ण बात यह है कि तीसरे तर्क में दूसरे के समान ही वर्णों की संख्या होती है।

ऐसे मामले भी होते हैं जब REPLACE() पूरी तरह से काम करता है लेकिन TRANSLATE() एक त्रुटि फेंकता है।

उदाहरण:

SELECT REPLACE('1234', '123', '4567') AS Replace;

परिणाम:

Replace
-------
45674  

इस मामले में, REPLACE() उम्मीद के मुताबिक काम करता है।

हालांकि, अगर हम TRANSLATE() . के लिए समान तर्क प्रदान करते हैं , हमें एक त्रुटि मिलती है:

SELECT TRANSLATE('1234', '123', '4567') AS Translate;

परिणाम:

Error: The second and third arguments of the TRANSLATE built-in function must contain an equal number of characters. 

जैसा कि त्रुटि संदेश बताता है, दूसरे और तीसरे तर्क में समान संख्या में वर्ण होने चाहिए।

मुझे REPLACE() का उपयोग कब करना चाहिए?

आपको REPLACE() . का उपयोग करना चाहिए जब आपको किसी विशिष्ट स्ट्रिंग की सभी घटनाओं को बदलने की आवश्यकता होती है, ठीक उसी तरह जैसे कि लिखा गया है। उदाहरण के लिए, किसी के नाम को दूसरे नाम में बदलना।

TRANSLATE() का उपयोग करना ऐसे मामलों में विनाशकारी परिणाम हो सकते हैं:

SELECT 
    REPLACE('Homer Simpson', 'Homer', 'Jason') AS Replace,
    TRANSLATE('Homer Simpson', 'Homer', 'Jason') AS Translate;

परिणाम:

Replace        Translate    
-------------  -------------
Jason Simpson  Jason Sispsan

मुझे ट्रांसलेट () का उपयोग कब करना चाहिए?

जैसा कि पिछले उदाहरण में दिखाया गया है, TRANSLATE() फ़ंक्शन उपयोगी हो सकता है यदि आपको मूल स्ट्रिंग के भीतर उनके क्रम की परवाह किए बिना निर्दिष्ट प्रत्येक वर्ण की सभी घटनाओं को बदलने की आवश्यकता है।

इसका उपयोग REPLACE() . के स्थान पर भी किया जा सकता है बस कोड के लिए। यहां एक उदाहरण दिया गया है (माइक्रोसॉफ्ट वेबसाइट पर एक उदाहरण के आधार पर):

SELECT 
    REPLACE(REPLACE(REPLACE(REPLACE('2*[3+4]/{7-2}','[','('), ']', ')'), '{', '('), '}', ')') AS Replace,
    TRANSLATE('2*[3+4]/{7-2}', '[]{}', '()()') AS Translate;

परिणाम:

Replace        Translate    
-------------  -------------
2*(3+4)/(7-2)  2*(3+4)/(7-2)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL प्रदर्शन:WHERE बनाम WHERE(ROW_NUMBER)

  2. SQL सर्वर आंतरिक:समस्याग्रस्त ऑपरेटर्स पं। मैं - स्कैन

  3. SQL सर्वर में त्रुटि "डेटिफ़ फ़ंक्शन के परिणामस्वरूप अतिप्रवाह" को कैसे ठीक करें?

  4. पहचान कॉलम डालने के लिए मैं इकाई ढांचे को कैसे मजबूर कर सकता हूं?

  5. SQL में पासिंग पैरामीटर क्या है और मुझे इसकी आवश्यकता क्यों है?