मैं इस सूत्र में आए तो आप हमेशा अपने स्वयं के समारोह बना सकते हैं कर सकते हैं एक ही आवश्यकता है लेकिन एक अलग प्रकार के डेटाबेस के लिए था जिसमें REVERSE
फ़ंक्शन की कमी थी।
मेरे मामले में यह ओपनएज (प्रगति) डेटाबेस के लिए था, जिसमें थोड़ा अलग वाक्यविन्यास है। इसने INSTR
फ़ंक्शन को मेरे लिए उपलब्ध कराया है जो most Oracle typed databases offer है।
तो मैं निम्नलिखित कोड के साथ आया था:
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
संपत्ति प्रदान करता है।
बस पूरी तरह से होने के लिए मैं इस स्केलर फ़ंक्शन को बनाने के लिए आवश्यक कोड जोड़ूंगा ताकि इसका उपयोग उसी तरह किया जा सके जैसा मैंने उपर्युक्त उदाहरणों में किया था। और ठीक वही करेगा जो ओपी चाहता था, SQL सर्वर के लिए LastIndexOf विधि के रूप में कार्य करता है।
-- 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
क्या आप अपनी स्ट्रिंग के कुछ उदाहरण दिखा सकते हैं? –
मेरे लिए भी, यह केवल अपठनीय नहीं है और अनुमान लगाने में सक्षम नहीं है कि आप नमूना डेटा के बिना क्या हासिल करने की कोशिश कर रहे हैं :) – techspider
प्यार स्टैक ओवरफ़्लो होना चाहिए जहां लोगों की पहली प्रतिक्रिया अधिक जानकारी मांगनी है, भले ही प्रश्न को और जानकारी की आवश्यकता न हो इसे हल करें :) –