दिलचस्प पोस्ट
कैनवास छवि क्रॉसप्लेफ़ेट असुरक्षित त्रुटि स्पाइडर (पायथन आईडीई) के लिए एक मॉड्यूल (विशेष रूप से पीमॉर्फ) जोड़ना ईसी 2 उदाहरण के लिए कुंजी युग्म बदलें एक अभिव्यक्ति में एकाधिक मानों के साथ एक स्ट्रिंग की तुलना करें फेसबुक कनेक्ट और एएसपी.नेट ArrayIndexOutOfBounds ListView में कई दृश्यों के लिए कस्टम एंड्रॉइड एडाप्टर के साथ अपवाद मिलान वाइल्डकार्ड सख्त है, लेकिन तत्व के संदर्भ के लिए कोई घोषणा नहीं मिल सकती है: घटक-स्कैन एएसपी.एन.टी.एम.टीवीसी कई बाल रिकॉर्ड संपादन का उदाहरण परिवर्तनीय आकार स्ट्रक्चर सी ++ UIImage image नामांकन रिटर्न शून्य किसी और एंड्रॉइड एप्लिकेशन से एक एंड्रॉइड एप्लिकेशन को कैसे कॉल करें jQuery के दो कार्यों के बीच क्लिक / टॉगल करें XSLT ट्रांसफ़ॉर्म काम नहीं करता जब तक कि मैं रूट नोड को हटा न दूं PHP पूर्णांक ओवरफ़्लो को बल दें Chrome में डेवलपर मोड एक्सटेंशन को पॉप अप अक्षम करें

टी-एसक्यूएल का उपयोग करते हुए उप-स्ट्रिंग की अंतिम घटना का सूचकांक ढूंढें

क्या एसक्यूएल का इस्तेमाल करते हुए स्ट्रिंग की अंतिम घटना के सूचक को ढूँढने का सीधा तरीका है? मैं अभी SQL Server 2000 का उपयोग कर रहा हूँ। मैं मूल रूप से कार्यक्षमता की आवश्यकता है जो .NET System.String.LastIndexOf विधि प्रदान करता है। एक छोटी गुगलिंग ने यह खुलासा किया – अंतिम सूचकांक प्राप्त करने के लिए फ़ंक्शन – लेकिन यदि आप "पाठ" कॉलम की अभिव्यक्ति में पास करते हैं तो यह काम नहीं करता है अन्य समाधान कहीं और भी मिलते हैं, जब तक कि आपके द्वारा खोजे जाने वाला पाठ 1 वर्ण लंबा है

मुझे संभवतः एक फ़ंक्शन को बनाना होगा अगर मैं ऐसा करता हूं, तो मैं इसे यहां पोस्ट करूंगा ताकि आप इसे देख सकें और शायद इसका उपयोग करें।

Solutions Collecting From Web of "टी-एसक्यूएल का उपयोग करते हुए उप-स्ट्रिंग की अंतिम घटना का सूचकांक ढूंढें"

आप पाठ डेटा प्रकार के लिए फ़ंक्शन की छोटी सूची तक सीमित हैं।

मैं सुझाव दे सकता हूं कि PATINDEX साथ शुरू हो रहा है, लेकिन जब तक आप परिणाम प्राप्त नहीं करते या शून्य (DATALENGTH-DATALENGTH) को समाप्त होने तक DATALENGTH-1, DATALENGTH-2, DATALENGTH-3 आदि से पीछे काम करते हैं।

यह वास्तव में कुछ ऐसा है जो SQL Server 2000 बस संभाल नहीं सकते हैं

अन्य उत्तरों के लिए संपादित करें : रिवर्स फ़ंक्शन की सूची पर नहीं है जिसका उपयोग SQL Server 2000 में पाठ डेटा के साथ किया जा सकता है

सरल तरीका है? नहीं, लेकिन मैंने रिवर्स का इस्तेमाल किया है। सचमुच।

पूर्व पद्धतियों में, किसी दिए गए स्ट्रिंग के अंतिम अवसर को जानने के लिए, मैंने मूल आदेश को पुनर्स्थापित करने के लिए रिवर द्वारा फिर से पीछा CHARINDEX का पालन करते हुए, रिवर्स () फ़ंक्शन का उपयोग किया था उदाहरण के लिए:

 SELECT mf.name ,mf.physical_name ,reverse(left(reverse(physical_name), charindex('\', reverse(physical_name)) -1)) from sys.master_files mf 

दिखाता है कि कैसे अपने "भौतिक नाम" से वास्तविक डेटाबेस फ़ाइल नाम निकालने के लिए, कोई भी सबफ़ोल्डर्स में गहराई से नेस्टेड नहीं है। यह केवल एक वर्ण (बैकस्लैश) के लिए खोज करता है, लेकिन आप इस पर अब खोज स्ट्रिंग के लिए निर्माण कर सकते हैं।

केवल नकारात्मक बात यह है, मुझे नहीं पता कि यह टेक्स्ट डेटा प्रकारों पर कितनी अच्छी तरह काम करेगा। मैं कुछ वर्षों के लिए एसक्यूएल 2005 पर रहा हूं, और अब टेक्स्ट के साथ काम करने के बारे में बात नहीं कर रहा हूं – लेकिन मुझे याद है कि आप इस पर LEFT और सही इस्तेमाल कर सकते हैं?

फिलिप

सरल तरीका है ….

 REVERSE(SUBSTRING(REVERSE([field]),0,CHARINDEX('[expr]',REVERSE([field])))) 

यदि आप Sqlserver 2005 या इसके बाद के संस्करण का उपयोग कर रहे हैं, तो कई बार REVERSE फ़ंक्शन का उपयोग करना प्रदर्शन के लिए हानिकारक है, नीचे कोड अधिक कुशल है।

 DECLARE @FilePath VARCHAR(50) = 'My\Super\Long\String\With\Long\Words' DECLARE @FindChar VARCHAR(1) = '\' -- Shows text before last slash SELECT LEFT(@FilePath, LEN(@FilePath) - CHARINDEX(@FindChar,REVERSE(@FilePath))) AS Before -- Shows text after last slash SELECT RIGHT(@FilePath, CHARINDEX(@FindChar,REVERSE(@FilePath))-1) AS After -- Shows the position of the last slash SELECT LEN(@FilePath) - CHARINDEX(@FindChar,REVERSE(@FilePath)) AS LastOccuredAt 
 DECLARE @FilePath VARCHAR(50) = 'My\Super\Long\String\With\Long\Words' DECLARE @FindChar VARCHAR(1) = '\' SELECT LEN(@FilePath) - CHARINDEX(@FindChar,REVERSE(@FilePath)) AS LastOccuredAt 

पुरानी लेकिन अभी भी मान्य प्रश्न, इसलिए यहाँ दूसरों द्वारा प्रदत्त जानकारी के आधार पर मैंने जो कुछ बनाया है, उसके बारे में।

 create function fnLastIndexOf(@text varChar(max),@char varchar(1)) returns int as begin return len(@text) - charindex(@char, reverse(@text)) -1 end 
 REVERSE(SUBSTRING(REVERSE(ap_description),CHARINDEX('.',REVERSE(ap_description)),len(ap_description))) 

मेरे लिए बेहतर काम किया

यह मेरे लिए बहुत अच्छी तरह से काम किया

 REVERSE(SUBSTRING(REVERSE([field]), CHARINDEX(REVERSE('[expr]'), REVERSE([field])) + DATALENGTH('[expr]'), DATALENGTH([field]))) 

हम्म, मुझे पता है कि यह एक पुरानी धागा है, लेकिन एक तालिका तालिका यह SQL2000 (या कोई अन्य डेटाबेस) में कर सकती है:

 DECLARE @str CHAR(21), @delim CHAR(1) SELECT @str = 'Your-delimited-string', @delim = '-' SELECT MAX(n) As 'position' FROM dbo._Tally WHERE substring(@str, _Tally.n, 1) = @delim 

एक मिलान तालिका संख्या बढ़ते हुए है।

substring(@str, _Tally.n, 1) = @delim प्रत्येक सीमांकक की स्थिति प्राप्त करता है, फिर आपको उस सेट में अधिकतम स्थिति प्राप्त होती है।

टैली टेबल भयानक हैं यदि आपने उन्हें पहले प्रयोग नहीं किया है, तो SQL सर्वर सेंट्रल (फ्री रेग, या बस बग मे नॉट ( http://www.bugmenot.com/view/sqlservercentral.com ) पर एक अच्छा लेख है।

* संपादित करें: हटाए गए n <= LEN(TEXT_FIELD) , जैसा कि आप TEXT प्रकार पर LEN () का उपयोग नहीं कर सकते। जब तक substring(...) = @delim रहता है तब तक इसका परिणाम अभी भी सही है।

दोनों अपनी स्ट्रिंग और उप-रिवर्स रिवर्स करें, फिर पहली घटना की खोज करें।

मुझे पता है यह एक बहुत साल का सवाल है, लेकिन …

Access 2010 , आप ऐसा करने के लिए InStrRev() का उपयोग कर सकते हैं। उम्मीद है की यह मदद करेगा।

मुझे पता है कि यह अक्षम हो जाएगा, लेकिन क्या आपने वर्चगर को text फ़ील्ड कास्टिंग करने पर विचार किया है ताकि आप पाए गए वेबसाइट के समाधान का उपयोग कर सकें? मुझे पता है कि यह समाधान मुद्दों को पैदा करेगा, जैसा कि आप संभवतः रिकॉर्ड को छोटा कर सकते हैं यदि text क्षेत्र की लंबाई आपके varchar की लंबाई से अधिक हो गई है (यह उल्लेख नहीं करने के लिए यह बहुत varchar नहीं होगा)।

चूंकि आपका डेटा text फ़ील्ड के भीतर है (और आप SQL Server 2000 का प्रयोग कर रहे हैं) आपके विकल्प सीमित हैं।

यदि आप शब्दों की एक स्ट्रिंग में अंतिम स्थान का सूचक प्राप्त करना चाहते हैं, तो आप इस अभिव्यक्ति का उपयोग कर सकते हैं RIGHT (नाम, (CHARINDEX ('', reverse (name), 0)) स्ट्रिंग में अंतिम शब्द वापस करने के लिए। उपयोगी है यदि आप एक पूर्ण नाम के अंतिम नाम को पार्स करना चाहते हैं जिसमें पहले और / या मध्य नाम के लिए अक्षर शामिल हैं।

@indexOf = <whatever characters you are searching for in your string>

@LastIndexOf = LEN([MyField]) - CHARINDEX(@indexOf, REVERSE([MyField]))

परीक्षण नहीं किया है, यह शून्य सूचकांक की वजह से एक के कारण बंद हो सकता है, लेकिन @indexOf कार्य में काम करता है जब @indexOf अक्षर से अपनी स्ट्रिंग के अंत में बंद काट रहा हो

SUBSTRING([MyField], 0, @LastIndexOf)

मुझे एक फ़ोल्डर पथ में एक बैकस्लैश के nth अंतिम स्थिति खोजने की आवश्यकता थी। यहाँ मेरा समाधान है

 /* http://stackoverflow.com/questions/1024978/find-index-of-last-occurrence-of-a-sub-string-using-t-sql/30904809#30904809 DROP FUNCTION dbo.GetLastIndexOf */ CREATE FUNCTION dbo.GetLastIndexOf ( @expressionToFind VARCHAR(MAX) ,@expressionToSearch VARCHAR(8000) ,@Occurrence INT = 1 -- Find the nth last ) RETURNS INT AS BEGIN SELECT @expressionToSearch = REVERSE(@expressionToSearch) DECLARE @LastIndexOf INT = 0 ,@IndexOfPartial INT = -1 ,@OriginalLength INT = LEN(@expressionToSearch) ,@Iteration INT = 0 WHILE (1 = 1) -- Poor man's do-while BEGIN SELECT @IndexOfPartial = CHARINDEX(@expressionToFind, @expressionToSearch) IF (@IndexOfPartial = 0) BEGIN IF (@Iteration = 0) -- Need to compensate for dropping out early BEGIN SELECT @LastIndexOf = @OriginalLength + 1 END BREAK; END IF (@Occurrence > 0) BEGIN SELECT @expressionToSearch = SUBSTRING(@expressionToSearch, @IndexOfPartial + 1, LEN(@expressionToSearch) - @IndexOfPartial - 1) END SELECT @LastIndexOf = @LastIndexOf + @IndexOfPartial ,@Occurrence = @Occurrence - 1 ,@Iteration = @Iteration + 1 IF (@Occurrence = 0) BREAK; END SELECT @LastIndexOf = @OriginalLength - @LastIndexOf + 1 -- Invert due to reverse RETURN @LastIndexOf END GO GRANT EXECUTE ON GetLastIndexOf TO public GO 

यहां मेरे परीक्षण के मामले हैं जो पास

 SELECT dbo.GetLastIndexOf('f','123456789\123456789\', 1) as indexOf -- expect 0 (no instances) SELECT dbo.GetLastIndexOf('\','123456789\123456789\', 1) as indexOf -- expect 20 SELECT dbo.GetLastIndexOf('\','123456789\123456789\', 2) as indexOf -- expect 10 SELECT dbo.GetLastIndexOf('\','1234\6789\123456789\', 3) as indexOf -- expect 5 

सीमांकक की अंतिम घटना से पहले हिस्सा प्राप्त करने के लिए (केवल NVARCHAR के लिए DATALENGTH उपयोग के कारण काम करता है):

 DECLARE @Fullstring NVARCHAR(30) = '12.345.67890.ABC'; DECLARE @Delimiter CHAR(1) = '.'; SELECT SUBSTRING(@Fullstring, 1, DATALENGTH(@Fullstring)/2 - CHARINDEX(@Delimiter, REVERSE(@Fullstring))); 

अन्य उत्तर में से कुछ एक वास्तविक स्ट्रिंग लौटते हैं जबकि वास्तविक सूचकांक int को जानना ज़्यादा ज़रूरत थी और जो जवाब ऐसा करते हैं, वे चीजों को अधिक जटिल मानते हैं प्रेरणा के रूप में अन्य उत्तरों में से कुछ का उपयोग करते हुए, मैंने निम्नलिखित किया …

सबसे पहले, मैंने एक फ़ंक्शन बनाया:

 CREATE FUNCTION [dbo].[LastIndexOf] (@stringToFind varchar(max), @stringToSearch varchar(max)) RETURNS INT AS BEGIN RETURN (LEN(@stringToSearch) - CHARINDEX(@stringToFind,REVERSE(@stringToSearch))) + 1 END GO 

फिर, अपनी क्वेरी में आप ऐसा कर सकते हैं:

 declare @stringToSearch varchar(max) = 'SomeText: SomeMoreText: SomeLastText' select dbo.LastIndexOf(':', @stringToSearch) 

उपरोक्त 23 को वापस आना चाहिए (':' का अंतिम सूचकांक)

उम्मीद है कि यह किसी के लिए थोड़ा आसान बना दिया!

यह जवाब ओपी की आवश्यकताओं को पूरा करता है। विशेष रूप से यह एक एकल चरित्र से अधिक सुई की अनुमति देता है और यह एक त्रुटि उत्पन्न नहीं करता है जब सूखी घास की ढंका में नहीं मिलती है मुझे ऐसा लग रहा था कि अन्य उत्तरों के अधिकांश (सभी?) ने उन बढ़त वाले मामलों को नहीं संभाला था इसके अलावा मैंने मूल एमएस एसक्यूएल सर्वर चारइंडएक्स फ़ंक्शन द्वारा प्रदत्त "शुरू की स्थिति" तर्क जोड़ा। मैंने चरम इंडेक्स के लिए विनिर्देशन को ठीक से दर्ज़ करने की कोशिश की, लेकिन बाएं से दाएं की बजाय बायीं तरफ प्रक्रिया करने के अलावा उदाहरण के लिए, अगर मैं सुई या सुई या रिक्त नल है तो मैं शून्य परत करता हूं और अगर सूखी घास की ढंका में नहीं मिलती है तो मैं शून्य लौटाता हूं। एक चीज जिसे मैं चारों ओर नहीं मिल सका, वह यह है कि निर्मित फ़ंक्शन के साथ तीसरा पैरामीटर वैकल्पिक है। SQL सर्वर उपयोगकर्ता परिभाषित फ़ंक्शंस के साथ, सभी पैरामीटर कॉल में उपलब्ध कराए जाने चाहिए, जब तक कि फ़ंक्शन "EXEC" का इस्तेमाल नहीं करते हैं पैरामीटर सूची में तीसरे पैरामीटर को शामिल करना आवश्यक है, लेकिन आप इसके लिए प्लेसहोल्डर के रूप में कीवर्ड "डिफ़ॉल्ट" प्रदान कर सकते हैं बिना इसे एक मूल्य देना (नीचे दिए गए उदाहरण देखें)। चूंकि इस फ़ंक्शन के तीसरे पैरामीटर को हटाने के लिए आसान नहीं है, अगर जरूरत न हो, तो इसे जोड़ने के लिए यह आवश्यक होगा कि मैं इसे यहां एक शुरुआती बिंदु के रूप में शामिल कर लिया।

 create function dbo.lastCharIndex( @needle as varchar(max), @haystack as varchar(max), @offset as bigint=1 ) returns bigint as begin declare @position as bigint if @needle is null or @haystack is null return null set @position=charindex(reverse(@needle),reverse(@haystack),@offset) if @position=0 return 0 return (len(@haystack)-(@position+len(@needle)-1))+1 end go select dbo.lastCharIndex('xyz','SQL SERVER 2000 USES ANSI SQL',default) -- returns 0 select dbo.lastCharIndex('SQL','SQL SERVER 2000 USES ANSI SQL',default) -- returns 27 select dbo.lastCharIndex('SQL','SQL SERVER 2000 USES ANSI SQL',1) -- returns 27 select dbo.lastCharIndex('SQL','SQL SERVER 2000 USES ANSI SQL',11) -- returns 1 

मैं इस धागा में आया था जब मेरी ऐसी ही समस्या का हल खोज रहा था, जिसकी सटीक आवश्यकता थी, लेकिन एक अलग तरह के डेटाबेस के लिए था जो REVERSE फ़ंक्शन की कमी थी।

मेरे मामले में यह एक OpenEdge (प्रगति) डेटाबेस के लिए था, जिसमें थोड़ा भिन्न वाक्यविन्यास है इसने INSTR फ़ंक्शन मेरे लिए उपलब्ध कराया है जो कि ज्यादातर ओरेकल टाइप किए गए डेटाबेस ऑफ़र करते हैं ।

तो मैं निम्नलिखित कोड के साथ आया था:

 SELECT INSTR(foo.filepath, '/',1, LENGTH(foo.filepath) - LENGTH( REPLACE( foo.filepath, '/', ''))) AS IndexOfLastSlash FROM foo 

हालांकि, मेरी विशिष्ट स्थिति के लिए ( ओपनएडगे (प्रगति) डेटाबेस) इसका परिणाम वांछित व्यवहार में नहीं हुआ क्योंकि रिक्त वर्णों के साथ वर्ण को बदलने से मूल स्ट्रिंग की समान लंबाई दी गई थी। यह मेरे लिए ज्यादा मायने नहीं रखता है, लेकिन मैं नीचे दिए गए कोड के साथ समस्या को बाईपास करने में सक्षम था:

 SELECT INSTR(foo.filepath, '/',1, LENGTH( REPLACE( foo.filepath, '/', 'XX')) - LENGTH(foo.filepath)) AS IndexOfLastSlash FROM foo 

अब मैं समझता हूं कि यह कोड टी-एसक्यूएल के लिए समस्या का समाधान नहीं करेगा क्योंकि INSTR समारोह के लिए कोई विकल्प नहीं है जो कि प्रॉपर्टी प्रॉपर्टी प्रदान करता है।

बस पूरा होने के लिए मैं इस स्केलर फ़ंक्शन को बनाने के लिए आवश्यक कोड जोड़ूंगा, इसलिए इसका उपयोग उसी तरह किया जा सकता है जैसे मैंने ऊपर दिए गए उदाहरणों में किया था

  -- Drop the function if it already exists IF OBJECT_ID('INSTR', 'FN') IS NOT NULL DROP FUNCTION INSTR GO -- User-defined function to implement Oracle INSTR in SQL Server CREATE FUNCTION INSTR (@str VARCHAR(8000), @substr VARCHAR(255), @start INT, @occurrence INT) RETURNS INT AS BEGIN DECLARE @found INT = @occurrence, @pos INT = @start; WHILE 1=1 BEGIN -- Find the next occurrence SET @pos = CHARINDEX(@substr, @str, @pos); -- Nothing found IF @pos IS NULL OR @pos = 0 RETURN @pos; -- The required occurrence found IF @found = 1 BREAK; -- Prepare to find another one occurrence SET @found = @found - 1; SET @pos = @pos + 1; END RETURN @pos; END GO 

स्पष्ट रूप से बचने के लिए, जब REVERSE फ़ंक्शन उपलब्ध है, आपको इस स्केलर फ़ंक्शन को बनाने की आवश्यकता नहीं है और आप इस तरह आवश्यक परिणाम प्राप्त कर सकते हैं:

 SELECT LEN(foo.filepath) - CHARINDEX('/', REVERSE(foo.filepath))+1 AS LastIndexOfSlash FROM foo