복붙노트

[SQL] SQL Server에서 lastIndexOf에서도이 있습니까?

SQL

SQL Server에서 lastIndexOf에서도이 있습니까?

나는 문자열의 마지막 인덱스를 받고 포함 된 문자열에서 값을 구문 분석하는 것을 시도하고있다. 현재, 나는 문자열을 반전 포함하는 끔찍한 해킹을하고있는 중이 야 :

SELECT REVERSE(SUBSTRING(REVERSE(DB_NAME()), 1, 
    CHARINDEX('_', REVERSE(DB_NAME()), 1) - 1))

나에게이 코드는 거의 읽을 수 없습니다. 난 그냥 SQL 서버 2016로 업그레이드하고 더 좋은 방법이 기대. 이 있습니까?

해결법

  1. ==============================

    1.마지막 후에 모든 것을 원하는 경우 _ 후 사용

    마지막 후에 모든 것을 원하는 경우 _ 후 사용

    select right(db_name(), charindex('_', reverse(db_name()) + '_') - 1)
    

    당신이 전에 모든 것을 원하는 경우) (왼쪽 사용 :

    select left(db_name(), len(db_name()) - charindex('_', reverse(db_name()) + '_'))
    
  2. ==============================

    2.선택한 문자 lastIndexOf에서도를 반환하는이 개 기능 1을 썼다.

    선택한 문자 lastIndexOf에서도를 반환하는이 개 기능 1을 썼다.

    CREATE FUNCTION dbo.LastIndexOf(@source nvarchar(80), @pattern char)
    RETURNS int
    BEGIN  
           RETURN (LEN(@source)) -  CHARINDEX(@pattern, REVERSE(@source)) 
    END;  
    GO
    

    1이 lastIndexOf에서도 전에 문자열을 반환합니다. 어쩌면 누군가에게 도움이 될 것입니다.

    CREATE FUNCTION dbo.StringBeforeLastIndex(@source nvarchar(80), @pattern char)
    RETURNS nvarchar(80)
    BEGIN  
           DECLARE @lastIndex int
           SET @lastIndex = (LEN(@source)) -  CHARINDEX(@pattern, REVERSE(@source)) 
    
         RETURN SUBSTRING(@source, 0, @lastindex + 1) 
         -- +1 because index starts at 0, but length at 1, so to get up to 11th index, we need LENGTH 11+1=12
    END;  
    GO
    
  3. ==============================

    3.여기에서 분할 문자열 중 하나가되면, 당신은이 같은 일련의 기반 방법으로 그것을 할 수 있습니다 ..

    여기에서 분할 문자열 중 하나가되면, 당신은이 같은 일련의 기반 방법으로 그것을 할 수 있습니다 ..

    declare @string varchar(max)
    set @string='C:\Program Files\Microsoft SQL Server\MSSQL\DATA\AdventureWorks_Data.mdf'
    
    ;with cte
    as
    (select *,row_number() over (order by (select null)) as rownum
    from [dbo].[SplitStrings_Numbers](@string,'\')
    )
    select top 1 item from cte order by rownum desc
    
    **Output:**  
    AdventureWorks_Data.mdf
    
  4. ==============================

    4.

    CREATE FUNCTION dbo.LastIndexOf(@text NTEXT, @delimiter NTEXT)  
    RETURNS INT
    AS       
    BEGIN  
      IF (@text IS NULL) RETURN NULL;
      IF (@delimiter IS NULL) RETURN NULL;
      DECLARE @Text2 AS NVARCHAR(MAX) = @text;
      DECLARE @Delimiter2 AS NVARCHAR(MAX) = @delimiter;
      DECLARE @Index AS INT = CHARINDEX(REVERSE(@Delimiter2), REVERSE(@Text2));
      IF (@Index < 1) RETURN 0;
      DECLARE @ContentLength AS INT = (LEN('|' + @Text2 + '|') - 2);
      DECLARE @DelimiterLength AS INT = (LEN('|' + @Delimiter2 + '|') - 2);
      DECLARE @Result AS INT = (@ContentLength - @Index - @DelimiterLength + 2);
      RETURN @Result;
    END
    
  5. ==============================

    5.아니, SQL 서버는 lastIndexOf에서도이 나던.

    아니, SQL 서버는 lastIndexOf에서도이 나던.

    이 사용할 수있는 문자열 함수입니다

    하지만 당신은 항상 당신의 자신의 함수를 만들 수 있습니다

    CREATE FUNCTION dbo.LastIndexOf(@source text, @pattern char)  
    RETURNS 
    AS       
    BEGIN  
        DECLARE @ret text;  
        SELECT into @ret
               REVERSE(SUBSTRING(REVERSE(@source), 1, 
               CHARINDEX(@pattern, REVERSE(@source), 1) - 1))
        RETURN @ret;  
    END;  
    GO 
    
  6. ==============================

    6.동일한 요구 사항을 가지고 있지만, REVERSE 기능이 결여 된 데이터베이스의 다른 종류이었다 내 비슷한 문제에 대한 해결책을 검색하는 동안 나는이 스레드를 건너 왔어요.

    동일한 요구 사항을 가지고 있지만, REVERSE 기능이 결여 된 데이터베이스의 다른 종류이었다 내 비슷한 문제에 대한 해결책을 검색하는 동안 나는이 스레드를 건너 왔어요.

    내 경우에는이 약간 구문이 다른 OpenEdge (진행) 데이터베이스에 대한했다. 이것은 대부분의 오라클 데이터베이스가 제공하는 입력했는지 나에게 사용할 수있는 INSTR 기능을했다.

    그래서 나는 다음과 같은 코드를 함께했다 :

    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
    

    지금은 INSTR 기능을 제공 그 선두로부터 속성에 다른 대안이 없기 때문에이 코드는 T-SQL에 대한 문제를 해결하지 않을 것을 이해합니다.

    그냥 내가 위의 예에서했던 것처럼 같은 방법을 사용할 수 있도록이 스칼라 함수를 만드는 데 필요한 코드를 추가 할 것입니다 철저합니다. 그리고 영업 이익은 원하는 것을 정확히 할 것입니다, SQL Server에 대한 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
    

    리버스 기능을 사용할 때 명백한을 방지하기 위해,이 스칼라 함수를 만들 필요가 없습니다 당신은 그냥이 같은 필요한 결과를 얻을 수 있습니다 :

    SELECT
      LEN(foo.filepath) - CHARINDEX('\', REVERSE(foo.filepath))+1 AS LastIndexOfSlash 
    FROM foo
    
  7. from https://stackoverflow.com/questions/39002025/is-there-a-lastindexof-in-sql-server by cc-by-sa and MIT license