【问题标题】:SQL Server Get URL Beginning TSQL Only?SQL Server 获取 URL 仅从 TSQL 开始?
【发布时间】:2011-10-18 09:25:44
【问题描述】:

在不要求 SQLCLR 在 C# 中使用正则表达式的情况下,从具有 5 亿行的表中获取 URL 的“词干”的最佳方法是什么?列是 VarChar(3000),表中的行如下:

http://a.com
http://b.au
http://c.edu?a=3
http://d.com/?a=3
http://d.com/?a=3&b=2
http://d.com/?a=3&b=2

我需要从表中选择并得到这个结果集:

http://a.com             1 
http://b.au              1
http://c.edu             1       
http://d.com             3

谢谢。

【问题讨论】:

    标签: sql sql-server aggregation


    【解决方案1】:

    如果你所有的 URL “词根”都以 '?' 结尾或'/?',你可以使用它。可以根据需要将其他截止模式添加到 CASE 语句中:

    DECLARE @test TABLE (URL varchar(3000))
    
    INSERT INTO @test (URL) VALUES ('http://a.com')
    INSERT INTO @test (URL) VALUES ('http://b.au')
    INSERT INTO @test (URL) VALUES ('http://c.edu?a=3')
    INSERT INTO @test (URL) VALUES ('http://d.com/?a=3')
    INSERT INTO @test (URL) VALUES ('http://d.com/?a=3&b=2')
    INSERT INTO @test (URL) VALUES ('http://d.com/?a=3&b=2')
    
    SELECT SUBSTRING(URL, 0, 
        CASE
            WHEN PATINDEX('%/?%', URL) > 0 THEN PATINDEX('%/?%', URL)
            WHEN PATINDEX('%?%', URL) > 0 THEN PATINDEX('%?%', URL)
            ELSE LEN(URL) + 1
        END), COUNT(*)
    FROM @test
    GROUP BY SUBSTRING(URL, 0, 
        CASE
            WHEN PATINDEX('%/?%', URL) > 0 THEN PATINDEX('%/?%', URL)
            WHEN PATINDEX('%?%', URL) > 0 THEN PATINDEX('%?%', URL)
            ELSE LEN(URL) + 1
        END)
    

    【讨论】:

      【解决方案2】:

      怎么样;

      ;with test (url) as (
          select 'http://a.com' union
          select 'http://b.au' union
          select 'http://c.edu?a=3' union
          select 'http://d.com/?a=3' union
          select 'http://d.com/?a=3&b=2' union all
          select 'http://d.com/?a=3&b=2'
      )
      select
          rtrim(replace(left(url, charindex('?', url + '?', 1) - 1) + ' ', '/ ', ''))
      from test
      
      
      >>>
      http://a.com
      http://b.au
      http://c.edu
      http://d.com
      http://d.com
      

      改成

      ...,COUNT(*)
      from test
          group by rtrim(replace(left(url, charindex('?', url + '?', 1) - 1) + ' ', '/ ', ''))
      

      为组。

      【讨论】:

      • 如果您希望在纯 T-SQL 中执行此操作,那么这是要走的路。但是,根据您所需的最终状态,您可能最好在应用程序或表示层中进行字符串格式化。字符串格式化根本不是 SQL 的强项之一。
      猜你喜欢
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-17
      • 2018-03-10
      • 1970-01-01
      相关资源
      最近更新 更多