ऐसा करने का तरीका 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