Bu iş parçacığına, tamamen aynı gereksinimi olan ancak aynı zamanda eksik olan farklı bir veritabanı türü için benzer sorunuma bir çözüm ararken rastladım. REVERSE
işlevi .
Benim durumumda bu, biraz farklı bir sözdizimi olan bir OpenEdge (Progress) veritabanı içindi . Bu INSTR
, çoğu Oracle tipi veritabanının sunduğu işlevi bana sağladı .
Bu yüzden şu kodu buldum:
SELECT
INSTR(foo.filepath, '/',1, LENGTH(foo.filepath) - LENGTH( REPLACE( foo.filepath, '/', ''))) AS IndexOfLastSlash
FROM foo
Bununla birlikte, benim özel durumum için ( OpenEdge (İlerleme) veritabanı olarak) bu istenen davranışla sonuçlanmadı çünkü karakteri boş bir karakterle değiştirmek orijinal dizeyle aynı uzunluğu verdi. Bu bana pek mantıklı gelmiyor ancak aşağıdaki kodla sorunu aşabildim:
SELECT
INSTR(foo.filepath, '/',1, LENGTH( REPLACE( foo.filepath, '/', 'XX')) - LENGTH(foo.filepath)) AS IndexOfLastSlash
FROM foo
Şimdi anlıyorum ki bu kod, T-SQL için problemi çözmeyecek çünkü INSTR
bunu sunan fonksiyonun alternatifi yok .Occurence
özelliği .
Sadece kapsamlı olmak gerekirse, bu skaler işlevi oluşturmak için gereken kodu ekleyeceğim, böylece yukarıdaki örneklerde yaptığım gibi kullanılabilecektir.
-- 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
Açık REVERSE
olanı önlemek için, işlev mevcut olduğunda bu skaler işlevi oluşturmanıza gerek yoktur ve aşağıdaki gibi gerekli sonucu elde edebilirsiniz:
SELECT
LEN(foo.filepath) - CHARINDEX('/', REVERSE(foo.filepath))+1 AS LastIndexOfSlash
FROM foo