【问题标题】:SQL text before the Nth match?第 N 个匹配之前的 SQL 文本?
【发布时间】:2023-03-11 13:46:01
【问题描述】:

使用 SQL 我想返回列中第三个正斜杠之前的所有文本

所以

/one/two/three/whatever/testing

会返回:

/one/two/three

在 SQL(特别是 MS SQL 2005+ 下的 MS T-SQL)中有任何快速而肮脏的方法吗?

【问题讨论】:

    标签: sql sql-server pattern-matching substring


    【解决方案1】:

    既然你说“又快又脏”,我假设这个非常快速和非常脏的解决方案不会收到一堆反对票。下面的 SQL 使用多个 SUBSTRING() 函数来查找第三个斜线:

    DECLARE @str VARCHAR(50)
    SET @str = '/one/two/three/whatever/testing'
    SELECT SUBSTRING(@str, 0, CHARINDEX('/', @str, CHARINDEX('/', @str, CHARINDEX('/', @str, CHARINDEX('/', @str, 0) + 1) + 1) + 1))
    

    您可以看到一个工作示例here

    【讨论】:

    • 非常好.. 我们可以做的任何事情都可以使用这个字符串 '/one/two/three%20rest/whatever/testing .. 谢谢。
    • @cyberpine,我不确定你的意思。据我所知,它适用于您评论中的字符串:data.stackexchange.com/stackoverflow/query/60986/…
    【解决方案2】:

    尝试添加功能

    /*
    Example:
    SELECT dbo.CHARINDEX2('a', 'abbabba', 3)
    returns the location of the third occurrence of 'a'
    which is 7
    */
    
    CREATE FUNCTION CHARINDEX2
    (
        @TargetStr varchar(8000), 
        @SearchedStr varchar(8000), 
        @Occurrence int
    )
    
    RETURNS int
    AS
    BEGIN
    
        DECLARE @pos INT, @counter INT, @ret INT
    
        set @pos = CHARINDEX(@TargetStr, @SearchedStr)
        set @counter = 1
    
        if @Occurrence = 1 set @ret = @pos
        else
        begin
    
            while (@counter < @Occurrence)
            begin
    
                select @ret = CHARINDEX(@TargetStr, @SearchedStr, @pos + 1)
    
                set @counter = @counter + 1
    
                set @pos = @ret
    
            end
    
        end
    
        RETURN(@ret)
    
    end
    

    然后这样引用函数...

    SELECT SUBSTRING('/one/two/three/whatever/testing', 0, dbo.CHARINDEX2('/', '/one/two/three/whatever/testing', 3))
    

    查看文章here 以获得更好的外观:)

    【讨论】:

      【解决方案3】:
      CREATE FUNCTION dbo.CharIndex2 (@expressionToFind VARCHAR(MAX), @expressionToSearch VARCHAR(MAX), @instance INT)
          RETURNS INT
      BEGIN
          DECLARE @Position INT
      
          DECLARE @i INT = 1
          WHILE @i <= @instance
          BEGIN
              SET @Position = CHARINDEX(@expressionToFind,@expressionToSearch,COALESCE(@Position+1,1))
              SET @i += 1
          END
      
          RETURN @Position
      END
      GO
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-11-23
        • 1970-01-01
        • 2021-10-01
        • 1970-01-01
        • 2013-07-02
        • 2014-09-04
        • 2013-02-23
        相关资源
        最近更新 更多