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

SQL सबस्ट्रिंग () फ़ंक्शन का उपयोग करके प्रो की तरह स्ट्रिंग्स को कैसे पार्स करें?

क्या आप स्ट्रिंग्स को पार्स करने का आनंद लेते हैं? यदि ऐसा है, तो उपयोग करने के लिए अनिवार्य स्ट्रिंग फ़ंक्शंस में से एक SQL सबस्ट्रिंग है। यह उन कौशलों में से एक है जो एक डेवलपर के पास किसी भी भाषा के लिए होना चाहिए।

तो, आप इसे कैसे करते हैं?

स्ट्रिंग पार्सिंग में महत्वपूर्ण बिंदु

मान लें कि आप पार्सिंग के लिए नए हैं। आपको कौन से महत्वपूर्ण बिंदु याद रखने चाहिए?

  1. जानें कि कौन-सी जानकारी स्ट्रिंग में अंतर्निहित है।
  2. एक स्ट्रिंग में जानकारी के प्रत्येक भाग की सटीक स्थिति प्राप्त करें। आपको स्ट्रिंग में सभी वर्णों को गिनना पड़ सकता है।
  3. एक स्ट्रिंग में प्रत्येक सूचना भाग के आकार या लंबाई को जानें।
  4. सही स्ट्रिंग फ़ंक्शन का उपयोग करें जो स्ट्रिंग में प्रत्येक जानकारी को आसानी से निकाल सकता है।

इन सभी कारकों को जानने से आप SQL सबस्ट्रिंग () का उपयोग करने और इसके लिए तर्क पारित करने के लिए तैयार होंगे।

एसक्यूएल सबस्ट्रिंग सिंटैक्स

SQL सबस्ट्रिंग का सिंटैक्स इस प्रकार है:

सबस्ट्रिंग (स्ट्रिंग एक्सप्रेशन, प्रारंभ, लंबाई)

  • स्ट्रिंग एक्सप्रेशन – शाब्दिक स्ट्रिंग या SQL अभिव्यक्ति जो एक स्ट्रिंग लौटाती है।
  • शुरू करें - एक संख्या जहां निष्कर्षण शुरू होगा। यह 1-आधारित भी है - स्ट्रिंग एक्सप्रेशन तर्क में पहला वर्ण 1 से शुरू होना चाहिए, 0 से नहीं। SQL सर्वर में, यह हमेशा एक सकारात्मक संख्या होती है। MySQL या Oracle में, हालांकि, यह सकारात्मक या नकारात्मक हो सकता है। अगर नकारात्मक है, तो स्कैनिंग स्ट्रिंग के अंत से शुरू होती है।
  • लंबाई - निकालने के लिए वर्णों की लंबाई। SQL सर्वर को इसकी आवश्यकता है। MySQL या Oracle में, यह वैकल्पिक है।

4 SQL सबस्ट्रिंग उदाहरण

<एच3>1. एक शाब्दिक स्ट्रिंग से निकालने के लिए SQL सबस्ट्रिंग का उपयोग करना

आइए एक शाब्दिक स्ट्रिंग का उपयोग करके एक साधारण उदाहरण से शुरू करें। हम एक प्रसिद्ध कोरियाई लड़की समूह, ब्लैकपिंक के नाम का उपयोग करते हैं, और चित्र 1 दिखाता है कि सबस्ट्रिंग कैसे काम करेगा:

नीचे दिया गया कोड दिखाता है कि हम इसे कैसे निकालेंगे:

-- extract 'black' from BlackPink (English)
SELECT SUBSTRING('BlackPink',1,5) AS result

अब, आइए चित्र 2 में सेट किए गए परिणाम का भी निरीक्षण करें:

क्या यह आसान नहीं है?

निकालने के लिए काला ब्लैकपिंक . से , आप स्थिति 1 से शुरू करते हैं और स्थिति 5 पर समाप्त होते हैं। BlackPink . के बाद से कोरियाई है, आइए जानें कि क्या सबस्ट्रिंग यूनिकोड कोरियाई वर्णों पर काम करता है।

(अस्वीकरण :मैं कोरियाई बोल, पढ़ या लिख ​​नहीं सकता, इसलिए मुझे विकिपीडिया से कोरियाई अनुवाद मिला। मैंने यह देखने के लिए Google अनुवाद का भी उपयोग किया कि कौन से वर्ण काले . से मेल खाते हैं और गुलाबी . कृपया मुझे क्षमा करें यदि यह गलत है। फिर भी, मुझे आशा है कि मैं जिस बिंदु को स्पष्ट करने का प्रयास कर रहा हूं वह आ जाएगा पार है)

चलो कोरियाई में स्ट्रिंग प्राप्त करें (चित्र 3 देखें)। जिन कोरियाई वर्णों का अनुवाद ब्लैकपिंक में किया गया है:

अब, नीचे दिए गए कोड को देखें। हम ब्लैक . से संबंधित दो वर्ण निकालेंगे

-- extract 'black' from BlackPink (Korean)
SELECT SUBSTRING(N'블랙핑크',1,2) AS result

क्या आपने N . से पहले कोरियाई स्ट्रिंग पर ध्यान दिया? ? यह यूनिकोड वर्णों का उपयोग करता है, और SQL सर्वर NVARCHAR मानता है और इसके पहले N होना चाहिए . अंग्रेजी संस्करण में केवल यही अंतर है। लेकिन क्या यह ठीक चलेगा? चित्र 4 देखें:

यह त्रुटियों के बिना चला।

<एच3>2. एक नकारात्मक प्रारंभ तर्क के साथ MySQL में SQL सबस्ट्रिंग का उपयोग करना

नकारात्मक प्रारंभ तर्क होने से SQL सर्वर में काम नहीं करेगा। लेकिन हमारे पास MySQL का उपयोग करके इसका एक उदाहरण हो सकता है। इस बार, गुलाबी निकालें ब्लैकपिंक . से . यह रहा कोड:

-- Extract 'Pink' from BlackPink using MySQL Substring (English)
select substring('BlackPink',-4,4) as result;

अब, आइए चित्र 5 में परिणाम देखें:

चूंकि हम -4 को प्रारंभ पैरामीटर में पास कर चुके हैं, इसलिए निष्कर्षण स्ट्रिंग के अंत से शुरू हुआ, 4 वर्ण पीछे जा रहा है। SQL सर्वर में समान परिणाम प्राप्त करने के लिए, RIGHT() फ़ंक्शन का उपयोग करें।

यूनिकोड वर्ण MySQL सबस्ट्रिंग के साथ भी काम करते हैं, जैसा कि आप चित्र 6 में देख सकते हैं:

यह ठीक काम किया। लेकिन क्या आपने ध्यान दिया कि हमें स्ट्रिंग से पहले N की आवश्यकता नहीं है? साथ ही, ध्यान दें कि MySQL में सबस्ट्रिंग प्राप्त करने के कई तरीके हैं। आप सबस्ट्रिंग पहले ही देख चुके हैं। MySQL में समतुल्य कार्य SUBSTR() और MID() हैं।

<एच3>3. चर प्रारंभ और लंबाई तर्कों के साथ सबस्ट्रिंग को पार्स करना

अफसोस की बात है कि सभी स्ट्रिंग एक्सट्रैक्शन निश्चित शुरुआत और लंबाई तर्कों का उपयोग नहीं करते हैं। ऐसे मामले में, आप जिस स्ट्रिंग को लक्षित कर रहे हैं उसकी स्थिति प्राप्त करने के लिए आपको CHARINDEX की आवश्यकता है। आइए एक उदाहरण लेते हैं:

DECLARE @lineString NVARCHAR(30) = N'김제니 01/16/[email protected]'
DECLARE @name NVARCHAR(5)
DECLARE @bday DATE
DECLARE @instagram VARCHAR(20)

SET @name = SUBSTRING(@lineString,1,CHARINDEX('@',@lineString)-11)
SET @bday = SUBSTRING(@lineString,CHARINDEX('@',@lineString)-10,10)
SET @instagram = SUBSTRING(@lineString,CHARINDEX('@',@lineString),30)

SELECT @name AS [Name], @bday AS [BirthDate], @instagram AS [InstagramAccount]

ऊपर दिए गए कोड में, आपको कोरियाई, जन्मतिथि और Instagram खाते में एक नाम निकालना होगा।

हम जानकारी के उन टुकड़ों को रखने के लिए तीन चर परिभाषित करने के साथ शुरू करते हैं। उसके बाद, हम स्ट्रिंग को पार्स कर सकते हैं और प्रत्येक वेरिएबल को परिणाम असाइन कर सकते हैं।

आप सोच सकते हैं कि निश्चित शुरुआत और लंबाई होना आसान है। इसके अलावा, हम वर्णों को मैन्युअल रूप से गिनकर इसे इंगित कर सकते हैं। लेकिन क्या होगा अगर आपके पास इनमें से बहुत कुछ एक टेबल पर है?

ये रहा हमारा विश्लेषण:

  • स्ट्रिंग में एकमात्र निश्चित आइटम @ . है इंस्टाग्राम अकाउंट में कैरेक्टर हम CHARINDEX का उपयोग करके स्ट्रिंग में इसकी स्थिति प्राप्त कर सकते हैं। फिर, हम उस स्थिति का उपयोग बाकी की शुरुआत और लंबाई प्राप्त करने के लिए करते हैं।
  • जन्मतिथि MM/dd/yyyy का उपयोग करके 10 वर्णों के साथ एक निश्चित प्रारूप में है।
  • नाम निकालने के लिए, हम 1 से शुरू करते हैं। चूंकि जन्मतिथि में 10 वर्ण और @ होते हैं। वर्ण, आप स्ट्रिंग में नाम के अंतिम वर्ण तक पहुँच सकते हैं। @ . की स्थिति से चरित्र, हम 11 वर्ण पीछे जाते हैं। सबस्ट्रिंग(@lineString,1,CHARINDEX('@',@lineString)-11) जाने का रास्ता है।
  • जन्मतिथि प्राप्त करने के लिए, हम वही तर्क लागू करते हैं। @ . की स्थिति प्राप्त करें चरित्र और जन्मतिथि प्रारंभ मूल्य प्राप्त करने के लिए 10 वर्णों को पीछे ले जाएं। 10 एक निश्चित लंबाई है। सबस्ट्रिंग(@lineString,CHARINDEX('@',@lineString)-10,10) जन्मतिथि कैसे प्राप्त करें।
  • आखिरकार, Instagram खाता प्राप्त करना सीधा है। @ . की स्थिति से प्रारंभ करें CHARINDEX का उपयोग कर चरित्र। नोट:30 Instagram उपयोगकर्ता नाम सीमा है।

चित्र 7 में परिणाम देखें:

<एच3>4. एक सेलेक्ट स्टेटमेंट में SQL सबस्ट्रिंग का उपयोग करना

आप SELECT स्टेटमेंट में SUBSTRING का भी उपयोग कर सकते हैं, लेकिन पहले, हमारे पास कार्यशील डेटा होना चाहिए। यह रहा कोड:

SELECT
 CAST(P.LastName AS CHAR(50)) 
 + CAST(P.FirstName AS CHAR(50)) 
 + CAST(ISNULL(P.MiddleName,'') AS CHAR(50)) 
 + CAST(ea.EmailAddress AS CHAR(50)) 
 + CAST(a.City AS CHAR(30)) 
 + CAST(a.PostalCode AS CHAR(15)) AS line
INTO PersonContacts
FROM Person.Person p
INNER JOIN Person.EmailAddress ea 
  ON P.BusinessEntityID = ea.BusinessEntityID
INNER JOIN Person.BusinessEntityAddress bea 
  ON P.BusinessEntityID = bea.BusinessEntityID
INNER JOIN Person.Address a 
  ON bea.AddressID = a.AddressID

उपरोक्त कोड नाम, ईमेल पता, शहर और डाक कोड युक्त एक लंबी स्ट्रिंग बनाता है। हम इसे व्यक्ति संपर्क . में भी संग्रहित करना चाहते हैं टेबल।

अब, सबस्ट्रिंग का उपयोग करके इंजीनियर को रिवर्स करने के लिए कोड दें:

SELECT
 TRIM(SUBSTRING(line,1,50)) AS [LastName]
,TRIM(SUBSTRING(line,51,50)) AS [FirstName]
,TRIM(SUBSTRING(line,101,50)) AS [MiddleName]
,TRIM(SUBSTRING(line,151,50)) AS [EmailAddress]
,TRIM(SUBSTRING(line,201,30)) AS [City]
,TRIM(SUBSTRING(line,231,15)) AS [PostalCode]
FROM PersonContacts pc
ORDER BY LastName, FirstName

चूंकि हमने निश्चित आकार के स्तंभों का उपयोग किया है, इसलिए CHARINDEX का उपयोग करने की कोई आवश्यकता नहीं है।

WHERE क्लॉज में SQL सबस्ट्रिंग का उपयोग करना - एक प्रदर्शन ट्रैप?

यह सच है। आपको WHERE क्लॉज में SUBSTRING का उपयोग करने से कोई नहीं रोक सकता। यह एक वैध वाक्यविन्यास है। लेकिन क्या होगा अगर यह प्रदर्शन समस्याओं का कारण बनता है?

इसलिए हम इसे एक उदाहरण के साथ साबित करते हैं और फिर चर्चा करते हैं कि इस मुद्दे को कैसे ठीक किया जाए। लेकिन पहले, आइए अपना डेटा तैयार करें:

USE AdventureWorks
GO

SELECT * INTO SalesOrders FROM Sales.SalesOrderHeader soh

मैं SalesOrderHeader में गड़बड़ी नहीं कर सकता टेबल, इसलिए मैंने इसे दूसरी टेबल पर छोड़ दिया। फिर, मैंने SalesOrderID . बनाया नए विक्रय आदेश . में तालिका एक प्राथमिक कुंजी।

अब, हम क्वेरी के लिए तैयार हैं। मैं SQL सर्वर के लिए dbForge Studio का उपयोग कर रहा हूं क्वेरी प्रोफाइलिंग मोड चालू . के साथ प्रश्नों का विश्लेषण करने के लिए।

SELECT
 so.SalesOrderID
,so.OrderDate
,so.CustomerID
,so.AccountNumber
FROM SalesOrders so
WHERE SUBSTRING(so.AccountNumber,4,4) = '4030'

जैसा कि आप देखते हैं, उपरोक्त क्वेरी ठीक चलती है। अब, चित्र 8 में क्वेरी प्रोफ़ाइल योजना आरेख देखें:

योजना आरेख सरल दिखता है, लेकिन आइए क्लस्टर्ड इंडेक्स स्कैन नोड के गुणों का निरीक्षण करें। विशेष रूप से, हमें रनटाइम जानकारी की आवश्यकता है:

उदाहरण 9 डेटाबेस इंजन द्वारा पढ़े गए 785 * 8KB पृष्ठ दिखाता है। यह भी ध्यान दें कि वास्तविक पंक्तियाँ पढ़ें 31,411 है। यह तालिका में पंक्तियों की कुल संख्या है। हालांकि, क्वेरी ने केवल 27,605 वास्तविक पंक्तियां लौटाईं।

संदर्भ के रूप में क्लस्टर्ड इंडेक्स का उपयोग करके पूरी तालिका को पढ़ा गया।

क्यों?

बात यह है कि SQL सर्वर को यह जानने की जरूरत है कि क्या 4030 एक खाता संख्या का एक विकल्प है। इसे प्रत्येक रिकॉर्ड को पढ़ना और मूल्यांकन करना चाहिए। उन पंक्तियों को छोड़ दें जो समान नहीं हैं और उन पंक्तियों को वापस कर दें जिनकी हमें आवश्यकता है। इससे काम तो हो जाता है लेकिन इतनी तेजी से नहीं।

इसे तेजी से चलाने के लिए हम क्या कर सकते हैं?

WHERE क्लॉज में सब्सट्रिंग करने से बचें और समान परिणाम जल्दी प्राप्त करें

अब हम जो चाहते हैं, वही परिणाम WHERE क्लॉज में SUBSTRING का उपयोग किए बिना प्राप्त करना है। नीचे दिए गए चरणों का पालन करें:

  • एक गणना कॉलम जोड़कर तालिका में बदलाव करें एक सबस्ट्रिंग (खाता संख्या, 4,4) . के साथ सूत्र। आइए इसे खाता श्रेणी नाम दें एक बेहतर कार्यकाल की कमी के कारण।
  • नई खाता श्रेणी के लिए एक गैर-संकुल अनुक्रमणिका बनाएं कॉलम। आदेश दिनांक . शामिल करें , खाता संख्या , और ग्राहक आईडी कॉलम।

बस।

हम नई खाता श्रेणी . को अनुकूलित करने के लिए क्वेरी के WHERE क्लॉज़ को बदलते हैं कॉलम:

SET STATISTICS IO ON

SELECT
 so.SalesOrderID
,so.OrderDate
,so.CustomerID
,so.AccountNumber
FROM SalesOrders so
WHERE so.AccountCategory = '4030'

SET STATISTICS IO OFF

WHERE क्लॉज में कोई सबस्ट्रिंग नहीं है। अब, योजना आरेख की जाँच करें:

इंडेक्स स्कैन को इंडेक्स सीक से बदल दिया गया है। यह भी ध्यान दें कि SQL सर्वर ने परिकलित कॉलम पर नई अनुक्रमणिका का उपयोग किया है। क्या तार्किक पठन और वास्तविक पंक्तियों में भी परिवर्तन होते हैं? चित्र 11 देखें:

785 से घटाकर 222 तार्किक पठन एक महान सुधार है, जो मूल तार्किक पठन से तीन गुना कम है। इसने वास्तविक पंक्तियों को भी कम कर दिया है केवल उन पंक्तियों को पढ़ें जिनकी हमें आवश्यकता है।

इस प्रकार, WHERE क्लॉज में SUBSTRING का उपयोग करना प्रदर्शन के लिए अच्छा नहीं है, और यह WHERE क्लॉज में उपयोग किए जाने वाले किसी अन्य स्केलर-मूल्यवान फ़ंक्शन के लिए जाता है।

निष्कर्ष

  • डेवलपर्स स्ट्रिंग्स को पार्स करने से नहीं बच सकते। इसकी आवश्यकता किसी न किसी रूप में उत्पन्न होगी।
  • स्ट्रिंग को पार्स करने में, स्ट्रिंग के भीतर की जानकारी, जानकारी के प्रत्येक भाग की स्थिति और उनके आकार या लंबाई को जानना आवश्यक है।
  • पार्सिंग फ़ंक्शन में से एक SQL सबस्ट्रिंग है। इसे केवल पार्स करने के लिए स्ट्रिंग, निष्कर्षण प्रारंभ करने की स्थिति और निकालने के लिए स्ट्रिंग की लंबाई की आवश्यकता होती है।
  • SUBSTRING के SQL सर्वर, MySQL और Oracle जैसे SQL फ्लेवर के बीच भिन्न व्यवहार हो सकते हैं।
  • आप टेबल कॉलम में शाब्दिक स्ट्रिंग्स और स्ट्रिंग्स के साथ सबस्ट्रिंग का उपयोग कर सकते हैं।
  • हमने यूनिकोड वर्णों के साथ SUBSTRING का भी उपयोग किया है।
  • WHERE क्लॉज में SUBSTRING या किसी अदिश-मूल्यवान फ़ंक्शन का उपयोग क्वेरी प्रदर्शन को कम कर सकता है। इसे अनुक्रमित परिकलित कॉलम के साथ ठीक करें।

अगर आपको यह पोस्ट मददगार लगती है, तो इसे अपने पसंदीदा सोशल मीडिया प्लेटफॉर्म पर साझा करें, या नीचे अपनी टिप्पणी साझा करें?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nextफॉर्म v3:डेटा और डेटाबेस माइग्रेशन के लिए पांच विकल्प

  2. Isql में पूर्ण त्रुटि संदेश प्राप्त करना

  3. क्या आपका ODBC ड्राइवर उपयोगकर्ता डेटा स्रोतों का समर्थन करता है?

  4. एसक्यूएल ऑर्डर बाय

  5. रेडशिफ्ट में कुल रनिंग की गणना कैसे करें