2010-06-16 19 views
5

मेरे पास पूर्ण नाम नामक कॉलम वाला एक SQL तालिका है, उदाहरण के लिए, "जॉन स्मिथ"।अंतिम नाम कॉलम पर अंतिम नाम से ऑर्डर कैसे करें?

पूर्ण नाम कॉलम में दिखाई देने वाले अंतिम नाम से डेटा को ऑर्डर कैसे कर सकता है?

"लॉरेंस जॉन फिशबर्न" जैसे लंबे नाम के लिए, मैं "फिशबर्न" शब्द से डेटा ऑर्डर करना चाहता हूं।

इस प्रकार, नाम आदेश

  • प्रथम नाम
  • मध्य नाम
  • अंतिम नाम

में जमा हो जाती मैं Microsoft SQL सर्वर का उपयोग कर रहा 2005

+1

अंतिम नाम परिभाषित करें। मेरा नाम "रॉबर्ट हेनरी स्मिथ" है। –

+0

@ डोमिनिक: संभवतः यह एक अंतरिक्ष चरित्र का अनुसरण करने वाला अंतिम शब्द होना चाहिए। बेशक, अपवाद होंगे, लेकिन शायद यह ज्यादातर नामों के लिए काम करेगा। – FrustratedWithFormsDesigner

+0

मैंने इस प्रश्न में स्पष्ट किया है। – GateKiller

उत्तर

1

संदेह होने पर, यह अपने आप करते हैं:

Select 
* 
From 
Users 
Order By 
LTrim(Reverse(Left(Reverse(FullName), CharIndex(' ', Reverse(FullName))))) Asc, 
FullName Asc -- Fall-over for when there isn't a last name 
0

यह वास्तव में इस पर निर्भर करता है कि नाम कैसे संग्रहीत किए जाते हैं। मान लिया जाये कि "अंतिम, प्रथम मध्य" आप की तरह

order by substring(0, charindex(',', FullName)) 

कुछ आप इसे एक छोटे से साथ बेला के लिए हो सकता है कर सकता है, लेकिन मुझे विश्वास है कि काम करना चाहिए।

+1

और इसके अतिरिक्त, यदि स्ट्रिंग में अंतिम नाम सही टोकन है तो ऊपर दिए गए समाधान के साथ रिवर्स() फ़ंक्शन का उपयोग करें। –

+3

कृपया प्रश्न को फिर से पढ़ें। साथ ही, सबस्ट्रिंग फ़ंक्शन के लिए आपका वाक्यविन्यास अमान्य है। – GateKiller

+0

@ गेटकिल्लर - मेरी प्रतिक्रिया मूल प्रश्न में पुनः स्पष्टीकरण से पहले लिखा गया था। – AllenG

1
create table foo(fullname varchar(100)) 
go 

insert into foo values ('Harry Smith'); 
insert into foo values ('John Davis'); 
insert into foo values ('Allision Thomas Williams'); 

SELECT fullname 
    , REVERSE(left(REVERSE(fullname), charindex(' ',REVERSE(fullname))-1)) 
    FROM foo 
ORDER BY REVERSE(left(REVERSE(fullname), charindex(' ',REVERSE(fullname))-1)) 

आउटपुट:

fullname     (No column name) 
John Davis     Davis 
Harry Smith     Smith 
Allision Thomas Williams Williams 
+0

आपको पूर्ण नाम की अंतिम स्ट्रिंग निर्धारित करने के लिए कई फ़ंक्शन कॉल (रिवर + बाएं + रिवर + charindex + REVERSE) का उपयोग करने की आवश्यकता नहीं है। एक ही सही + CHARINDEX + रिवर्स आपको चाहिए, मेरा जवाब देखें। –

7
कुछ

मैं क्या करना होगा जैसे:

SELECT FullName 
FROM TABLE 
ORDER BY REVERSE(SUBSTRING(REVERSE(FullName), 0, CHARINDEX(' ', REVERSE(FullName)))) 
+4

जबकि यह सबसे कुशल/इष्टतम समाधान नहीं है यह काम करता है, क्यों -1 ?? –

2

इस कोशिश, इसे इस्तेमाल करता है पूर्ण नाम में अंतिम स्थान खोजने के लिए न्यूनतम संख्या में फ़ंक्शंस tring, जो प्रदर्शन की मदद करनी चाहिए:

DECLARE @YourTable table (FullNamevarchar(30)) 

INSERT @YourTable VALUES ('Harry Smith'); 
INSERT @YourTable VALUES ('John Davis'); 
INSERT @YourTable VALUES ('Allision Thomas Williams'); 

SELECT 
    FullName 
     ,RIGHT(FullName, CHARINDEX(' ', REVERSE(FullName)) - 1) AS SortBy 
    FROM @YourTable 
    ORDER BY RIGHT(FullName, CHARINDEX(' ', REVERSE(FullName)) - 1) 

उत्पादन:

FullName      SortBy 
------------------------------ ------------------------------ 
John Davis      Davis 
Harry Smith     Smith 
Allision Thomas Williams  Williams 

(3 row(s) affected) 

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

+0

यह विफल रहता है अगर कॉलम में केवल एक ही नाम है। – GateKiller

+0

@ गेटकिल्लर, इसका उपयोग करें, एक पूर्ण नाम के लिए काम करेगा और बिना किसी रिक्त स्थान वाला नाम होगा: 'दाएं (पूर्ण नाम, ISNULL (NULLIF (CHARINDEX (' ', रिवर (पूर्णनाम)) - 1, -1), लेंस (पूर्णनाम))) –

1

इस चाल करना होगा:

create table #tmpTable 
(
    ID int identity(1,1) primary key, 
    FullName varchar(100) not null 
); 

insert into #tmpTable(FullName) values('Big John Sansom'); 
insert into #tmpTable(FullName) values('Mike Douglas Reid'); 
insert into #tmpTable(FullName) values('First Second Last'); 
insert into #tmpTable(FullName) values('JustOneTokenForName'); 

select 
    FullName, 
    LastName = case 
     when CHARINDEX(FullName,' ') = 0 THEN FullName 
     else RIGHT(FullName, CHARINDEX(' ', REVERSE(FullName)) - 1) 
    end 
from #tmpTable 
order by LastName 

drop table #tmpTable 
+0

यह विफल रहता है अगर कॉलम में केवल एक ही नाम है। – GateKiller

+3

@ गेटकिल्लर: यदि आप अपने प्रश्न में इन जैसे आवश्यकताओं को अर्हता प्राप्त करना चाहते हैं तो शायद यह सभी पाठकों के लिए सहायक होगा। इस अतिरिक्त आवश्यकता को शामिल करने के लिए समाधान अब अपडेट किया गया है। –

5

के बजाय की गणना क्या अंतिम नाम हर बार जब आप क्वेरी चलाना चाहते है, तो आप एक गणना स्तंभ है कि एक स्तंभ में वास्तविक मूल्य बनी रहती है हो सकता है कर सकते हैं किसी भी अन्य कॉलम के रूप में इस्तेमाल किया जाना चाहिए।

ALTER TABLE Customer 
    ADD LastName AS 
     RIGHT(FullName, CHARINDEX(' ', REVERSE(FullName)) - 1) PERSISTED 

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

संपादित करें: को रिक्तियों के मूल्यों के साथ सौदा करने के लिए:

ALTER TABLE Customer 
    ADD LastName AS 
    case when CHARINDEX(' ', REVERSE(FullName)) > 0 
    then RIGHT(FullName, CHARINDEX(' ', REVERSE(FullName)) - 1) 
    else 
    FullName 
    end 
    PERSISTED 

हालांकि आप के रूप में आप यह निर्धारित करने के क्या इस मामले में क्या होता होगा इस समारोह के साथ बेला कर सकते हैं। मेरा मुद्दा यह दिखाने के लिए है कि केस स्टेटमेंट का इस्तेमाल किया जा सकता है। टाइप मिस्चैच से बचने के लिए आप सभी आउटपुट पथों को एक ही प्रकार में डालना भी चाह सकते हैं।

+0

यह केवल SQL सर्वर 2005+ –

+0

में काम करेगा यह विफल रहता है अगर कॉलम में केवल एक ही नाम है। गणना किए गए कॉलम का सुझाव देने के लिए – GateKiller

+0

+1 - अन्य सभी समाधान इंडेक्स का उपयोग करने में सक्षम नहीं होंगे। यद्यपि सबसे अच्छा मार्ग इसे अंतरिम समाधान के रूप में उपयोग करना होगा जब तक कि नाम को एकाधिक कॉलम और फ्रंट-एंड/रिपोर्ट/आदि में अलग किया जा सके। इसे संभालने के लिए बदल दिया। –

0

क्वेरी

SELECT stringrowname FROM tablename 
ORDER BY SUBSTRING_INDEX((stringrowname)," ",-1); 

यह अंतिम शब्द से तार आदेश वापस आ जाएगी।

संबंधित मुद्दे