【问题标题】:Parse Html File Name From Full Path Using Sql Server使用 Sql Server 从完整路径解析 Html 文件名
【发布时间】:2018-07-03 19:46:34
【问题描述】:

在以下示例中,我需要从 Sql Server SELECT 语句中的完整路径解析 HTML 文件名:

Declare @x table(Id int primary key, form_url varchar(256))

Insert  @x values (1, 'Agents/Accounting/Agent.html')
Insert  @x values (2, 
'Modules/Vendors/Vendors/VendorInformation/Vendor.html')
Insert  @x values (3, 
'Modules/Customers/Customers/AccountInformation/Account.html?AccountNo')

Select * from @x

注意:路径之间的层数不定,HTML文件名后面可能有数据。

我正在寻找的输出是:

  • Agent.html
  • Vendor.html
  • Account.html

【问题讨论】:

    标签: sql sql-server sql-server-2016


    【解决方案1】:

    T-SQL 不是为字符串操作而设计的。但有可能实现你所需要的:

    Select x.*, IIF(CHARINDEX('?', sub.s) > 0,
                    LEFT(sub.s, CHARINDEX('?', sub.s)-1),
                    sub.s) result
    from @x x
    CROSS APPLY (SELECT IIF(CHARINDEX('/',form_url) > 0,
                           RIGHT(form_url,CHARINDEX('/', REVERSE(form_url))-1),
                            form_url)) sub(s);
    

    DBFiddle Demo

    【讨论】:

      【解决方案2】:

      您可以使用reverse 和charindex 将所有内容添加到最后一个斜杠,然后使用charindex 或substring 来限制HTML 页面。

      Declare @x table(Id int primary key, form_url varchar(256))
      
      Insert  @x values (1, 'Agents/Accounting/Agent.html')
      Insert  @x values (2, 
      'Modules/Vendors/Vendors/VendorInformation/Vendor.html')
      Insert  @x values (3, 
      'Modules/Customers/Customers/AccountInformation/Account.html?AccountNo')
      
      Select 
          *
          ,FullPath = right(form_url,charindex('/',reverse(form_url)) - 1) 
          ,OnlyHtml = left(right(form_url,charindex('/',reverse(form_url)) - 1) ,charindex('.html',right(form_url,charindex('/',reverse(form_url)) + 3)))
          ,AnotherOnlyHtml = right(substring(form_url,1,charindex('.html',form_url) + 4),charindex('/',reverse(substring(form_url,1,charindex('.html',form_url) + 4))) - 1) 
      from @x
      

      【讨论】:

        【解决方案3】:

        如果对辅助函数感兴趣。这是一个修改后的解析/拆分函数,它接受两个不同的分隔符。在您的情况下为"/" 和"?"。您可能已经注意到附加了一个“?”以防万一你错过了。

        示例

        Select * 
         From @x
         Cross Apply [dbo].[tvf-Str-Extract](form_url+'?','/','?') B
        

        回报

        感兴趣的功能

        CREATE FUNCTION [dbo].[tvf-Str-Extract] (@String varchar(max),@Delimiter1 varchar(100),@Delimiter2 varchar(100))
        Returns Table 
        As
        Return (  
        
        with   cte1(N)   As (Select 1 From (Values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) N(N)),
               cte2(N)   As (Select Top (IsNull(DataLength(@String),0)) Row_Number() over (Order By (Select NULL)) From (Select N=1 From cte1 N1,cte1 N2,cte1 N3,cte1 N4,cte1 N5,cte1 N6) A ),
               cte3(N)   As (Select 1 Union All Select t.N+DataLength(@Delimiter1) From cte2 t Where Substring(@String,t.N,DataLength(@Delimiter1)) = @Delimiter1),
               cte4(N,L) As (Select S.N,IsNull(NullIf(CharIndex(@Delimiter1,@String,s.N),0)-S.N,8000) From cte3 S)
        
        Select RetSeq = Row_Number() over (Order By N)
              ,RetPos = N
              ,RetVal = left(RetVal,charindex(@Delimiter2,RetVal)-1) 
         From  (
                Select *,RetVal = Substring(@String, N, L) 
                 From  cte4
               ) A
         Where charindex(@Delimiter2,RetVal)>1
        
        )
        /*
        Max Length of String 1MM characters
        
        Declare @String varchar(max) = 'Dear [[FirstName]] [[LastName]], ...'
        Select * From [dbo].[tvf-Str-Extract] (@String,'[[',']]')
        */
        

        【讨论】:

          猜你喜欢
          • 2010-09-18
          • 1970-01-01
          • 2011-02-02
          • 1970-01-01
          • 2011-04-13
          • 1970-01-01
          • 2015-01-21
          • 2014-01-16
          相关资源
          最近更新 更多