2016-08-09 7 views
7

मैं अपनी समस्या के लिए सही क्वेरी नहीं ढूंढ पा रहा हूं। मेरे पास डीबी में एक टेबल है और मुझे इसे एक बहुत ही विशिष्ट तरीके से सॉर्ट करने की आवश्यकता है - मैं जिस कॉलम को सॉर्ट कर रहा हूं वह एक पता है, और यह संख्या के साथ शुरू होता है, लेकिन मुझे इसे नंबर को अनदेखा करने की आवश्यकता है।SQL क्वेरी को वर्णानुक्रम से कैसे क्रमबद्ध करें लेकिन प्रमुख संख्याओं को अनदेखा करें?

यहाँ मेरी डेटा सेट है: मैं सॉर्ट करने के लिए की जरूरत है

id | address 
1 | 23 Bridge road 
2 | 14 Kennington street 
3 | 7 Bridge road 
4 | 12 Oxford street 
5 | 9 Bridge road 

इस तरह:

id | address 
1 | 7 Bridge road 
2 | 9 Bridge road 
3 | 23 Bridge road 
4 | 14 Kennington street 
5 | 12 Oxford street 

अब तक मुझे मिल गया केवल इस:

SELECT id, address 
FROM propertySearch 
Order by address ASC. 

किसी को भी मेरी मदद कर बाहर कर सकते हैं इस पर?

+5

के साथ उपयोग करें क्या RDBMS आप के साथ काम कर रहे हैं? –

+1

एसक्यूएल के पास 'TRIM' फ़ंक्शन का उपयोग करने पर एक नज़र डालें, जिसमें SQL है http://www.w3resource.com/sql/character-functions/trim.php लेकिन उस डेटाबेस को टैग करें जिसे आप उपयोग कर रहे हैं क्योंकि बेहतर तरीके हो सकते हैं , डेटाबेस – David

+0

पर निर्भर करता है कि पता कैसे संग्रहीत किया जाता है? आम तौर पर आप अलग-अलग स्तंभों में संख्या और सड़क का नाम संग्रहीत करेंगे, लेकिन यदि नहीं, तो मैं स्ट्रिंग को विभाजित करने और पहले स्थान से पहले सबकुछ हटाने के लिए लिंटो सबस्ट्रिंग और ट्रिम करूँगा। –

उत्तर

3

यदि यह हमेशा उस प्रारूप हो जाएगा (अग्रणी संख्या , एक स्थान और फिर पता), तो आप यह कर सकते हैं:

एसक्यूएल-सर्वर:

SELECT * FROM YourTable t 
ORDER BY SUBSTRING(t.address,CHARINDEX(' ',t.address,1),99) 

MySQL:

SELECT * FROM YourTable t 
ORDER BY SUBSTRING_INDEX(t.address,' ',-1) 

प्रारूप स्थिर नहीं है, तो आप एसक्यूएल सर्वर-patindex() उपयोग कर सकते हैं:

SELECT * FROM YourTable t 
ORDER BY SUBSTRING(t.address,PATINDEX('%[A-z]%',t.address),99) 

नोट: यह बुरा डीबी डिजाइन है !! प्रत्येक मान को अपने स्वयं के कॉलम में ठीक से संग्रहीत किया जाना चाहिए, ई.जी STREET, CITY, APARTMANT_NUMBER ईटीसी, अगर नहीं, तो वे वास्तव में इसका नेतृत्व कर रहे हैं।

+0

चलो ईमानदार रहें: यह हमेशा प्रारूप नहीं होगा। – Twinkles

+0

ईमानदार हो, यह क्यों नहीं होगा? – sagi

+0

कुछ पतों में कोई संख्या नहीं है। एक उदाहरण: हे मेजेस्टी द रानी, ​​बकिंघम पैलेस, लंदन एसडब्ल्यूए 1 एए – Twinkles

0

जैसा कि आपने vb.net टैग किया है, अनुमान है कि आप एमएस एसक्यूएल का उपयोग करते हैं। आप हमेशा एक रिक्त स्थान के साथ सड़क संख्या और सड़क के नाम को अलग कर रहे हैं, इस तरह के आदेश देने की कोशिश:

ORDER BY RIGHT([address], LEN([address]) - CHARINDEX(' ', [address], 1))

+0

यदि अंतरिक्ष द्वारा विभाजित दो संख्या अनुक्रम होते हैं तो यह असफल हो जाएगा। यानी '7 5 ब्रिज रोड'। –

+0

निश्चित रूप से यह होगा, लेकिन एक सामान्य स्थिति में सड़क संख्या में रिक्त स्थान के साथ कोई संख्या नहीं होनी चाहिए। –

+0

आप कभी नहीं जानते कि उपयोगकर्ता क्या इनपुट कर सकते हैं। –

0
Declare @Table table (id int,address varchar(100)) 
Insert into @Table values 
(1,'23 Bridge road'), 
(2,'14 Kennington street'), 
(3,'7 Bridge road'), 
(4,'12 Oxford street'), 
(5,'9 Bridge road') 

Select * From @Table 
Order By substring(address,patindex('%[a-z]%',address),200) 
     ,cast(substring(address,1,charindex(' ',address)) as int) 

रिटर्न

id address 
3 7 Bridge road 
5 9 Bridge road 
1 23 Bridge road 
2 14 Kennington street 
4 12 Oxford street 
+0

लेकिन केनिंगटन सड़क से पहले ऑक्सफोर्ड सड़क को सॉर्ट करना गलत है, है ना? – Twinkles

+0

@ टिंकल्स धन्यवाद, मैं पिछला% लापता था। ग्रेट कैच –

2

आप एसक्यूएल सर्वर का उपयोग करते हैं, तो आप PATINDEX और STUFF के संयोजन का उपयोग कर सकते हैं:

SELECT *, STUFF(T.address, 1, PATINDEX('%[A-z]%', T.address) - 1, '') 
FROM #Table1 AS T 
ORDER BY STUFF(T.address, 1, PATINDEX('%[A-z]%', T.address) - 1, '') 

PATINDEX अपने स्ट्रिंग में पहले अक्षर सूचकांक मिलेगा और STUFF कि सूचकांक को शुरू से ही सब कुछ ट्रिम करने के लिए प्रयोग किया जाता है।

उत्पादन है कि:

id address     No column name) 
--------------------------------------------- 
1 23 Bridge road   Bridge road 
3 7 Bridge road   Bridge road 
5 9 Bridge road   Bridge road 
2 14 Kennington street Kennington street 
4 12 Oxford street  Oxford street 

मैंने यह भी देखा है कि आप अपने अपेक्षित आउटपुट में अलग आदेश दिया है। अगर यह इरादा था। आपको ROW_NUMBER का उपयोग करने की आवश्यकता है:

SELECT ROW_NUMBER() OVER(ORDER BY STUFF(T.address, 1, PATINDEX('%[A-z]%', T.address) - 1, ''), T.id) AS ID, T.address 
FROM #Table1 AS T; 

यह क्वेरी प्रत्येक पंक्ति के लिए नई आईडी उत्पन्न करेगी।
परिणाम:

id address 
------------------------ 
1 23 Bridge road 
2 7 Bridge road 
3 9 Bridge road 
4 14 Kennington street 
5 12 Oxford street 


वैसे भी, यह नहीं बल्कि hacky समाधान है।

मैं आपको सलाह देता हूं कि आप अलग-अलग कॉलम, जैसे सड़क का नाम, डाक कोड, घर का नंबर, घर का पत्र (वैकल्पिक), शहर इत्यादि में अपना पता संग्रहित करें। यह एक बेहतर तरीका होगा।

+1

शायद एक समस्या अगर पता इस '25 ए ब्रिज रोड ' –

+0

जैसा है तो यह वास्तव में सही है। इसे ठीक करने के लिए एक रास्ता मिल जाएगा :) –

1

मुझे लगता है कि इस तरह के संचालन व्यापार परत के लिए अधिक है।
यदि आप सभी डेटा को .NET कोड में लोड करते हैं - सॉर्टिंग अधिक आसान, अधिक पठनीय और रखरखाव योग्य होगा।

Public Class Address 

    Public Property Id As Integer 
    Public Property AddressData As String 

    'This property can be used for sorting  
    Public ReadOnly Property SortedKey As String 
     Get 
      Dim rawData As IEnumerable(Of String) = Me.AddressData.Split(" "c).Skip(1) 
      Return String.Join(" ", rawData) 
     End Get 
    End Property 

End Class 

फिर LINQ

Dim loaded As List(Of Address) = yourLoadFunction() 
Dim sorted = loaded.OrderBy(Function(item) item.SortedKey).ToList() 
संबंधित मुद्दे