정확히 동일한 요구 사항이 있지만 다른 종류의 데이터베이스에 대한 비슷한 문제에 대한 솔루션을 검색하는 동안이 스레드를 발견했습니다. REVERSE
기능 .
필자의 경우 이것은 약간 다른 구문 을 가진 OpenEdge (Progress) 데이터베이스를위한 것입니다. 이로 인해 대부분의 Oracle 유형 데이터베이스가 제공 하는 INSTR
기능을 사용할 수있게되었습니다. .
그래서 다음 코드를 생각해 냈습니다.
SELECT
INSTR(foo.filepath, '/',1, LENGTH(foo.filepath) - LENGTH( REPLACE( foo.filepath, '/', ''))) AS IndexOfLastSlash
FROM foo
그러나 특정 상황 ( OpenEdge (Progress) 데이터베이스)의 경우 문자를 빈 문자로 바꾸면 원래 문자열과 길이가 같기 때문에 원하는 동작을 얻지 못했습니다. 이것은 나에게 의미가 없지만 아래 코드의 문제를 무시할 수있었습니다.
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