मैं किसी तालिका में किसी विशिष्ट स्तंभ के पहले वर्णों को कैसे निकालूं?


162

SQL में, मैं किसी तालिका में किसी विशिष्ट स्तंभ के मानों के पहले 4 वर्णों को कैसे निकाल सकता हूं? कॉलम नाम है Student Codeऔर एक उदाहरण मूल्य है ABCD123Stu1231। मैं सभी रिकॉर्ड के लिए अपनी तालिका से पहले 4 चार्ट निकालना चाहता हूं

कृपया मेरा मार्गदर्शन करें

जवाबों:


259
SELECT RIGHT(MyColumn, LEN(MyColumn) - 4) AS MyTrimmedColumn

संपादित करें: व्याख्या करने के लिए, राइट को संचालित करने के लिए 2 तर्क - स्ट्रिंग (या स्तंभ) लेता है, और लौटने के लिए वर्णों की संख्या (स्ट्रिंग के "दाईं ओर" शुरू होती है)। LEN कॉलम डेटा की लंबाई लौटाता है, और हम चार को घटाते हैं ताकि हमारा राइट फंक्शन बाकि 4 अक्षरों को "पीछे" छोड़ दे।

आशा है कि यह समझ में आता है।

फिर से संपादित करें - मैं अभी एंड्रयू की प्रतिक्रिया पढ़ता हूं, और वह बहुत अच्छी तरह से सही ढंग से व्याख्या कर सकता है, और मुझसे गलती हो सकती है। यदि यह स्थिति है (और आप केवल doctored परिणामों के बजाय तालिका को अद्यतन करना चाहते हैं), तो आप यह कर सकते हैं:

UPDATE MyTable
SET MyColumn = RIGHT(MyColumn, LEN(MyColumn) - 4)

वह सही रास्ते पर है, लेकिन उसका समाधान 4 पात्रों को स्ट्रिंग के प्रारंभ में रखेगा , बजाय 4 वर्णों को छोड़ने के।


9
यह <4 वर्णों के साथ मानों के लिए विफल हो जाएगा। आपको <4. के लिए कॉलम का मान लौटाने के लिए एक केस ब्लॉक जोड़ना चाहिए
स्कॉट Ivey

2
इसे सँभालने का सबसे अच्छा तरीका यह होगा: UPDATE MyTableSET MyColumn = RIGHT (MyColumn, LEN (MyColumn) - 4) WHEN LEN (MyColumn)> 4 SUBSTRING में कोई त्रुटि नहीं होगी, लेकिन यह अनावश्यक रूप से "अपडेट" पंक्तियों को भी अद्यतन करेगा। चार से कम अक्षर वाले। उस ने कहा, ओपी ने संकेत दिया कि वे एक विशिष्ट स्तंभ के पहले 4 वर्णों को ट्रिम करना चाहते थे - मैं मानूंगा जब तक कि अधिक विवरण के साथ प्रदान नहीं किया जाता है कि सभी पंक्तियों को छंटनी की आवश्यकता है।
एरोन एल्टन

1
@ spencer7593 - हाहाहा ... सच। आप हमेशा सुरक्षित रहने के लिए WHERE क्लॉज जोड़ सकते हैं: WHN NOT ISNUMERIC (LEFT (MyColumn, 1))
हारून एल्टन

क्या इसे NULL कॉलम पर कॉल करना सुरक्षित है? इस मामले में क्या होगा?
इयान आर। ओ'ब्रायन

मैंने इसका उपयोग COL_LENGTH('MyTable', 'MyColumn')करने के बजाय समाप्त कर दिया LEN(MyColumn)क्योंकि मेरे मामले में मैं पहले n वर्णों को बाहर करना चाहता था, चाहे स्तंभ के भीतर वास्तविक सामग्री का आकार कोई भी हो, लेकिन इससे अच्छा काम किया!
sfarbota 16

86
Stuff(someColumn, 1, 4, '')

यह कहता है, पहले 1चरित्र की स्थिति के साथ शुरू , 4पात्रों को कुछ नहीं के साथ बदलें''


7
पुराना प्रश्न जो मुझे पता है, लेकिन मैं इस समाधान को पसंद करता हूं, क्योंकि यह 1 फ़ंक्शन का उपयोग नहीं करता है या इसमें कुछ यादृच्छिक बड़ी संख्या है।
एडविन स्टेलर

4
इससे भी अधिक: यदि someColumnCTE या सबहेटिंग से सबसेंप्टल जैसा कुछ जटिल है, तो इसे दो बार मूल्यांकन करने की आवश्यकता नहीं है।
जेफ

1
FYI करें, यह समाधान संख्यात्मक मानों को ट्रिम करने के लिए वास्तव में अच्छी तरह से काम करता है।
स्टीवन बॉल

1
आपने जो कहा, उसे बढ़ाने के लिए, यहाँ एक पूरा परिणाम है। सबसे पहले, एक चयन करें, यह सुनिश्चित करें कि आप चाहते हैं कि उर पंक्तियाँ प्राप्त करें, फिर इस अद्यतन में वह अधिकार प्राप्त करें। नोट / खबरदार - इसके बाद इसे सफलतापूर्वक चलाने के बाद इसे फिर से न चलाएं, क्योंकि इसके लिए पहले 4 वर्णों की अंधाधुंध कटाई होती है: अपडेट टेबल सेट टेक्स्टफिल्ड = (सेलेक्ट एसटीयूएफएफ (कंवर्ट (मैक्स), टेक्स्टस्क्रीन), 1, 4, '')) जहां एक्टिविटी टाइप = 'ए' और अप्रूव्ड> -30 2017-06-30 'और टेक्स्टफिल्ड को'% द काउंटी 1% 'और टेक्स्टफिल्ड को'% द काउंटी 2% 'पसंद नहीं है और अमूर्त'% द काउंटी 3% 'की तरह नहीं) और एक्टिविट इन (१२३४५, ... आई डी की सीमा ...
५६ range d

33

LEN का उपयोग क्यों करें ताकि आपके पास 2 स्ट्रिंग फ़ंक्शन हों? आप सभी की जरूरत चरित्र 5 पर है ...

...SUBSTRING (Code1, 5, 8000)...

1
क्या यह भविष्य का प्रमाण है? क्या यह संभव है कि MSSQL के भावी संस्करण 8,000 से अधिक बड़े अधिकतम आकार का उपयोग कर सकते हैं?
डेवेलपर वीब्स

3
varchar (max) पहले से ही 8000 char से बड़ा है। यदि आप लेन (स्तंभ) डालते हैं, तो यह हमेशा के लिए काम करेगा
Gaspa79

2
या सिर्फ 2000000000 का उपयोग करें। एक LEN फ़ंक्शन क्यों जोड़ें। कोई मान नहीं जोड़ता है और अनुगामी स्थानों को भी अनदेखा करता है (यदि आप उन्हें चाहते हैं)
gbn

1
धन्यवाद, यह मेरे लिए एक बंद चीज के रूप में अच्छी तरह से काम किया। स्वीकृत उत्तर किसी कारण से कुछ मामलों में अतिरिक्त पात्रों को काट देने के लिए था, लेकिन यह त्रुटिपूर्ण काम करता है।
user2366842

2
@ user2366842 स्वीकार किए गए उत्तर का उपयोग करने का संभावित कारण अतिरिक्त वर्णों को काट रहा था, संभवत: यह कि आपके पाठ में रिक्त स्थान थे। यदि आप RTRIM और LTRIM का उपयोग करके चाहते हैं तो आप इसकी भरपाई कर सकते हैं।
स्पाजमोसे


7

यहाँ एक आसान नकली है जो आप करने की कोशिश कर रहे हैं :)

CREATE TABLE Codes
(
code1 varchar(10),
code2 varchar(10)
)

INSERT INTO Codes (CODE1, CODE2) vALUES ('ABCD1234','')


UPDATE Codes
SET code2 = SUBSTRING(Code1, 5, LEN(CODE1) -4)

इसलिए, उस क्षेत्र के विरुद्ध अंतिम कथन का उपयोग करें जिसे आप ट्रिम करना चाहते हैं :)

SUBSTRING फ़ंक्शन FIFTH वर्ण से शुरू होकर, कोड 1 को नीचे ले जाता है, और CODE1 कम 4 की लंबाई के लिए जारी रहता है (वर्णों की संख्या शुरू में ही समाप्त हो जाती है)।


5

पूरी बात

DECLARE @v varchar(10)

SET @v='#temp'

select STUFF(@v, 1, 1, '')
WHERE LEFT(@v,1)='#'

3

आप इसे SQL में भी कर सकते हैं।

substring(StudentCode,4,len(StudentCode))

वाक्य - विन्यास

substring (ColumnName,<Number of starting Character which u want to remove>,<length of given string>)

3

इसे इस्तेमाल करे। 100% काम कर रहा है

UPDATE Table_Name
SET RIGHT(column_name, LEN(column_name) - 1)

  


3

शीर्ष उत्तर उपयुक्त नहीं है जब मूल्यों की लंबाई 4 से कम हो सकती है।

टी-एसक्यूएल में

आपको "सही फ़ंक्शन के लिए अमान्य लंबाई पैरामीटर पास हो जाएगा" क्योंकि यह नकारात्मक स्वीकार नहीं करता है। CASE कथन का उपयोग करें:

SELECT case when len(foo) >= 4 then RIGHT(foo, LEN(foo) - 4) else '' end AS myfoo from mytable;

पोस्टग्रेज में

4 से कम मान एक त्रुटि के बजाय नीचे आश्चर्यजनक व्यवहार देते हैं, क्योंकि RIGHT के लिए नकारात्मक मान पूरे स्ट्रिंग के बजाय पहले वर्णों को ट्रिम करता है। यह उपयोग करने के लिए अधिक समझ में आता हैRIGHT(MyColumn, -5) बजाय ।

एक उदाहरण जो आपको मिलता है, जब आप "-5" के बजाय शीर्ष उत्तर की "लंबाई - 5" का उपयोग करते हैं, तो इसकी तुलना करें:

create temp table foo (foo) as values ('123456789'),('12345678'),('1234567'),('123456'),('12345'),('1234'),('123'),('12'),('1'), ('');

select foo, right(foo, length(foo) - 5), right(foo, -5) from foo;

foo       len(foo) - 5  just -5   
--------- ------------  -------     
123456789 6789          6789 
12345678  678           678  
1234567   67            67   
123456    6             6    
12345                       
1234      234               
123       3                 
12                          
1                           

1
आप किस डेटाबेस का उपयोग करते हैं? प्रश्न में tsql टैग है, लेकिन T-SQL नकारात्मक मापदंडों की अनुमति नहीं देता है। मुझे त्रुटि संदेश मिला "सही कार्य के लिए अमान्य लंबाई पैरामीटर।"
पलोटा

मुझे टैग नहीं लगे। टी-एसक्यूएल और पोस्टग्रेज खंडों में विभाजित उत्तर। धन्यवाद।
नूमेनन

2

इसमें अंतर्निहित ट्रिम फ़ंक्शन है जो उद्देश्य के लिए एकदम सही है।

SELECT trim(both 'ag' from 'asdfg');
btrim 
-------
 sdf
(1 riga)

http://www.postgresql.org/docs/8.1/static/functions-string.html


1
हालांकि यह PostgreSQL उपयोगकर्ताओं के लिए उपयोगी हो सकता है, ओपी प्रश्न टैग में tsql / sql-server निर्दिष्ट करता है।
कोडमोंकी 1313

2

यह साझा करना अच्छा होगा, DB2 उपयोग के लिए: INSERT(someColumn, 1, 4, '')

Stuff DB2 में समर्थित नहीं है


1

यदि आपको पहले कुछ वर्णों को हटाना है जो एक विशेष चरित्र से पहले हैं #, तो यह एक अच्छा है:

UPDATE tblInvalidID
SET [ColumnName] =stuff(ColumnName, 1, charindex('#', ColumnName), ' ') 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.