इस समस्या के कई समाधान प्रतीत होते हैं, हालाँकि मेरे समाधानों को गतिशील होने की आवश्यकता है क्योंकि सीमांकक की संख्या 0 और 3 के बीच बदलती है और अपेक्षाकृत कुशल होने की आवश्यकता है क्योंकि यह 5 छोरों में> 10m पंक्तियों में चल रहा होगा।

उदाहरण के रूप में:

  US

  US-AL

  US-AL-Talladega

  US-AL-Talladega-35160

समाधान को देश, राज्य, काउंटी, ज़िप फ़ील्ड में प्रत्येक आइटम को NULL फ़ील्ड के साथ जमा करने में सक्षम होना चाहिए यदि जानकारी स्ट्रिंग के भीतर नहीं है।

सर्वोत्तम दृष्टिकोण पर किसी भी टिप्पणी की सराहना की जाएगी या यहां तक ​​​​कि मुझे उस दिशा में भी इंगित किया जाएगा जहां मैं संभव हो सकता है एक समाधान की सराहना की जाएगी

-1
Methexis 3 सितंबर 2018, 14:39
या कोई अन्य भाषा लेकिन मैं इस समाधान के लिए SQL सर्वर के साथ फंस गया हूं। मैं जिस वर्तमान समाधान पर काम कर रहा हूं, वह एकाधिक सबस्ट्रिंग/चारिंडेक्स संयोजन है, लेकिन यह किसी भी तरह से सबसे कुशल नहीं है!
 – 
Methexis
3 सितंबर 2018, 14:45
1
SQL सर्वर का कौन सा संस्करण?
 – 
sticky bit
3 सितंबर 2018, 14:53
आप जिस कोड का उपयोग कर रहे हैं उसे पोस्ट करें।
 – 
Salman A
3 सितंबर 2018, 15:11

2 जवाब

क्रॉस या आउटर एप्लाई के साथ कंसर्ट में थोड़ा एक्सएमएल के साथ एक और विकल्प है

उदाहरण

Declare @YourTable table (YourCol varchar(100))
Insert Into @YourTable values
 ('US')
,('US-AL')
,('US-AL-Talladega')
,('US-AL-Talladega-35160')

Select A.* 
      ,B.*
 From @YourTable A
 Outer Apply (
                Select Country = xDim.value('/x[1]','varchar(max)')
                      ,State   = xDim.value('/x[2]','varchar(max)')
                      ,County  = xDim.value('/x[3]','varchar(max)')
                      ,ZIP     = xDim.value('/x[4]','varchar(max)')
                From  (Select Cast('<x>' + replace(YourCol,'-','</x><x>')+'</x>' as xml) as xDim) as A 
             ) B

रिटर्न

YourCol                 Country State   County      ZIP
US                      US      NULL    NULL        NULL
US-AL                   US      AL      NULL        NULL
US-AL-Talladega         US      AL      Talladega   NULL
US-AL-Talladega-35160   US      AL      Talladega   35160
2
John Cappelletti 3 सितंबर 2018, 15:42

आपको एक सीमांकित फाड़नेवाला की आवश्यकता होगी। जैसे DelimitedSplit8K http://www.sqlservercentral.com/articles/ से टैली+टेबल/72993/

; with tbl as
(
    select  col = 'US'          union all
    select  col = 'US-AL'           union all
    select  col = 'US-AL-Talladega'     union all
    select  col = 'US-AL-Talladega-35160'
)
select  t.col,
        max(case when ItemNumber = 1 then Item end) as Country,
        max(case when ItemNumber = 2 then Item end) as State,
        max(case when ItemNumber = 3 then Item end) as County,
        max(case when ItemNumber = 4 then Item end) as Zip
from    tbl t
        cross apply dbo.[DelimitedSplit8K](t.col, '-')
group by t.col
0
Squirrel 3 सितंबर 2018, 14:55