আমার একই সমস্যাটির সমাধানের সন্ধান করতে গিয়ে আমি এই থ্রেডটি পেরিয়ে এসেছি যার সঠিক একই চাহিদা ছিল তবে ভিন্ন ধরণের ডাটাবেসের জন্যও ছিল যেটিরও অভাব ছিল REVERSE
ফাংশনটিও ছিল না।
আমার ক্ষেত্রে এটি একটি ওপেন এজ (প্রগ্রেস) ডাটাবেসের জন্য ছিল, যার সামান্য আলাদা সিনট্যাক্স রয়েছে। এটি বেশিরভাগ ওরাকল টাইপ করা ডেটাবেসগুলির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
ফাংশনটির কোনও বিকল্প নেই যা প্রস্তাব করে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