[sql-server] T-SQL을 사용하여 하위 문자열이 마지막으로 발생한 인덱스 찾기

SQL을 사용하여 마지막으로 나타나는 문자열의 색인을 찾는 간단한 방법이 있습니까? 지금 SQL Server 2000을 사용하고 있습니다. 기본적으로 .NET System.String.LastIndexOf메서드가 제공 하는 기능이 필요 합니다. 약간의 인터넷 검색에서 이것을 보여주었습니다- 마지막 색인을 검색하는 기능 – “텍스트”열 표현식을 전달하면 작동하지 않습니다. 다른 곳에서 찾은 다른 솔루션은 검색하는 텍스트가 1 자 길이 인 경우에만 작동합니다.

아마도 기능을 요리해야 할 것입니다. 그렇게하면 여기에 게시하여 여러분이보고 사용하도록하겠습니다.



답변

텍스트 데이터 유형에 대한 작은 기능 목록으로 제한됩니다 .

내가 제안 할 수있는 것은로 시작 PATINDEX하지만 DATALENGTH-1, DATALENGTH-2, DATALENGTH-3결과를 얻거나 0으로 끝날 때까지 등에서 뒤로 작동합니다 (DATALENGTH-DATALENGTH)

이것은 실제로 SQL Server 2000처리 할 수없는 것입니다 .

다른 답변 편집 : REVERSE는 SQL Server 2000의 텍스트 데이터와 함께 사용할 수있는 함수 목록에 없습니다.


답변

간단한 방법? 아니요, 그러나 나는 그 반대를 사용했습니다. 말 그대로.

이전의 루틴에서 주어진 문자열의 마지막 발생을 찾기 위해 REVERSE () 함수, CHARINDEX, REVERSE를 차례로 사용하여 원래 순서를 복원했습니다. 예를 들어 :

SELECT
   mf.name
  ,mf.physical_name
  ,reverse(left(reverse(physical_name), charindex('\', reverse(physical_name)) -1))
 from sys.master_files mf

하위 폴더에 얼마나 깊이 중첩되어 있는지에 관계없이 “실제 이름”에서 실제 데이터베이스 파일 이름을 추출하는 방법을 보여줍니다. 이것은 하나의 문자 (백 슬래시) 만 검색하지만 더 긴 검색 문자열을 위해이를 작성할 수 있습니다.

유일한 단점은 이것이 TEXT 데이터 유형에서 얼마나 잘 작동하는지 모르겠습니다. 나는 몇 년 동안 SQL 2005를 사용해 왔으며 더 이상 TEXT 작업에 익숙하지 않지만 왼쪽과 오른쪽을 사용할 수 있다고 생각합니다.

필립


답변

가장 간단한 방법은 …

REVERSE(SUBSTRING(REVERSE([field]),0,CHARINDEX('[expr]',REVERSE([field]))))


답변

Sqlserver 2005 이상을 사용하는 경우 REVERSE함수를 여러 번 사용 하면 성능이 저하되므로 아래 코드가 더 효율적입니다.

DECLARE @FilePath VARCHAR(50) = 'My\Super\Long\String\With\Long\Words'
DECLARE @FindChar VARCHAR(1) = '\'

-- Shows text before last slash
SELECT LEFT(@FilePath, LEN(@FilePath) - CHARINDEX(@FindChar,REVERSE(@FilePath))) AS Before
-- Shows text after last slash
SELECT RIGHT(@FilePath, CHARINDEX(@FindChar,REVERSE(@FilePath))-1) AS After
-- Shows the position of the last slash
SELECT LEN(@FilePath) - CHARINDEX(@FindChar,REVERSE(@FilePath)) AS LastOccuredAt


답변

DECLARE @FilePath VARCHAR(50) = 'My\Super\Long\String\With\Long\Words'
DECLARE @FindChar VARCHAR(1) = '\'

SELECT LEN(@FilePath) - CHARINDEX(@FindChar,REVERSE(@FilePath)) AS LastOccuredAt


답변

오래되었지만 여전히 유효한 질문이므로 여기에 다른 사람들이 제공 한 정보를 기반으로 만든 내용이 있습니다.

create function fnLastIndexOf(@text varChar(max),@char varchar(1))
returns int
as
begin
return len(@text) - charindex(@char, reverse(@text)) -1
end


답변

이것은 나를 위해 아주 잘 작동했습니다.

REVERSE(SUBSTRING(REVERSE([field]), CHARINDEX(REVERSE('[expr]'), REVERSE([field])) + DATALENGTH('[expr]'), DATALENGTH([field])))