मैं अपनी इसी समस्या के समाधान की खोज करते हुए इस सूत्र में आया था जिसकी आवश्यकता एक ही थी लेकिन एक अलग तरह के डेटाबेस के लिए जो REVERSE
फ़ंक्शन की कमी थी ।
मेरे मामले में यह एक OpenEdge (प्रगति) डेटाबेस के लिए था, जिसमें थोड़ा अलग वाक्यविन्यास है। इसने INSTR
मेरे लिए सबसे अधिक Oracle टाइप किए गए डेटाबेस उपलब्ध कराए ।
तो मैं निम्नलिखित कोड के साथ आया:
SELECT
INSTR(foo.filepath, '/',1, LENGTH(foo.filepath) - LENGTH( REPLACE( foo.filepath, '/', ''))) AS IndexOfLastSlash
FROM foo
हालांकि, मेरी विशिष्ट स्थिति (होने के लिए) OpenEdge (प्रगति) डेटाबेस ) यह वांछित व्यवहार में परिणाम नहीं हुआ, क्योंकि चरित्र को खाली चार के साथ बदलने से मूल स्ट्रिंग के समान लंबाई दी गई। यह मेरे लिए बहुत मायने नहीं रखता है लेकिन मैं नीचे दिए गए कोड के साथ समस्या को बायपास करने में सक्षम था:
SELECT
INSTR(foo.filepath, '/',1, LENGTH( REPLACE( foo.filepath, '/', 'XX')) - LENGTH(foo.filepath)) AS IndexOfLastSlash
FROM foo
अब मैं समझता हूं कि यह कोड समस्या का समाधान नहीं करेगा T-SQL के क्योंकि जो INSTR
फ़ंक्शन प्रदान करता है उसका कोई विकल्प नहीं हैOccurence
संपत्ति है।
बस पूरी तरह से होने के लिए मैं इस स्केलर फ़ंक्शन को बनाने के लिए आवश्यक कोड जोड़ूंगा ताकि इसका उपयोग उसी तरह किया जा सके जैसे मैंने उपरोक्त उदाहरणों में किया था।
-- 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