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

मैं इस मेलिंग एड्रेस SQL ​​सर्वर सेलेक्ट स्टेटमेंट को कैसे सुधार सकता हूँ?

ऐसा करने का तरीका UNPIVOT के साथ है। यहाँ समाधान है:

With AddrTable as (
Select AddrFld, MailAddr From (
Select Cast(ISNULL([Line1], '') as Varchar(102)) as [A1], 
       Cast(ISNULL([Line2], '') as Varchar(102)) as [A2], 
       Cast(ISNULL([Line3], '') as Varchar(102)) as [A3], 
       Cast(ISNULL(LTRIM(RTRIM(City)),'') + ' ' + ISNULL(LTRIM(RTRIM(RegionCode)),'') + '  ' + ISNULL(LTRIM(RTRIM(PostalCode)),'') as Varchar(102)) as A4
From TableName Where [email protected]) p
Unpivot (MailAddr For AddrFld in ([A1], [A2], [A3], [A4])) as unpvt)
Select Row_Number() over (Order by (Case Len(MailAddr) When 0 then 1 else 0 end), AddrFld) as RN, 
MailAddr From AddrTable 
Order By RN

यह रहा आउटपुट:

Address1
Westby WI  55555
-empty line-
-empty line-

ध्यान दें कि मुझे क्षेत्र की लंबाई के रूप में "वर्चर (102)" का उपयोग करना था (अनपिवोट की आवश्यकता है कि सभी फ़ील्ड समान हों) क्योंकि आपके शहर/क्षेत्र/डाक में कुल 102 वर्ण हो सकते हैं। साथ ही, ध्यान दें कि "@UniqueID" उस रिकॉर्ड के लिए पहचानकर्ता है जिसका पता आपको चाहिए। यह चार और हमेशा चार पंक्तियों . देता है आपके पते के लिए आवश्यक डेटा युक्त।

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

Create View AddressRows AS
 With AddrTable as (
 Select UniqueID, AddrFld, MailAddr From (
 Select UniqueID, 
       Cast(ISNULL([Line1], '') as Varchar(102)) as [A1], 
       Cast(ISNULL([Line2], '') as Varchar(102)) as [A2], 
       Cast(ISNULL([Line3], '') as Varchar(102)) as [A3], 
       Cast(ISNULL(LTRIM(RTRIM(City)),'') + ' ' + ISNULL(LTRIM(RTRIM(RegionCode)),'') + '  ' + ISNULL(LTRIM(RTRIM(PostalCode)),'') as Varchar(102)) as A4
 From TableName Where [email protected]) p
 Unpivot (MailAddr For AddrFld in ([A1], [A2], [A3], [A4])) as unpvt)
 Select UniqueID, 
       Row_Number() over (Order by (Case Len(MailAddr) When 0 then 1 else 0 end), AddrFld) as RN, 
       MailAddr From AddrTable 

और फिर, जब आप अपनी मेल खाने वाली "पंक्ति" को बाहर निकालना चाहते हैं, तो इस SQL ​​​​का उपयोग करके इसे वापस पिवट करें (ध्यान दें कि मैं UniqueID का उपयोग करके फिर से क्वेरी कर रहा हूं):

Select [Addr1], [Addr2], [Addr3], [Addr4] From (
Select Top 4 'Addr' + Cast(Row_Number() over (Order by RN) as Varchar(12)) as AddrCol,  -- "Top 4" needed so we can sneak the "Order By" in 
MailAddr 
From AddressRows Where [email protected]
) p PIVOT (Max([MailAddr]) for AddrCol in ([Addr1], [Addr2], [Addr3], [Addr4])
) as pvt

यह रिटर्न:

Addr1            Addr2                Addr3           Addr4
--------------   ------------------   -------------   ------------------ 
Address1         Westby WI  54667                                                 


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ExecuteScalar NullReferenceException को फेंकता है

  2. SQL में WHERE क्लॉज में LIKE और NULL

  3. अल्पविराम और अवधि के साथ SQL सर्वर 2005 मुद्रा प्रारूप

  4. SQL सर्वर सुरक्षा फ़ंक्शन को समझना HAS_Permis_BY_Name और इसके उपयोग के मामले

  5. संग्रहीत प्रक्रिया EXEC बनाम sp_executesql अंतर?