如何从T-SQL中的字段剥离Querystring?

问题描述

| 我有一个充满日志的sql表,该表显示页面的响应时间。例如:
/MyPage1.aspx
/MyPage2.aspx
/MyPage3.aspx?index=4
/MyPage3.aspx?index=5
/MyPage3.aspx?index=7
但是,我想创建一个视图,向我显示每个页面的平均加载时间。为此,我不希望包含查询字符串,因为我只想按问号前的URL对页面进行分组(因此,“ 1”仅显示一次)。 此处适合使用哪些字符串函数去除查询字符串?     

解决方法

棘手的部分是...。数据并不总是包含?。标记。您可以找到的位置吗?使用charindex,但要选择其左侧的数据,则需要使用CharIndex-1。找不到,CharIndex返回0,Left(data,0-1)导致错误。 一种简单的解决方案是确保始终可以找到CharIndex。像这样:
Select Left(URL,CharIndex(\'?\',URL + \'?\')-1)
From   @Temp
请注意,我执行URL + \'?\'的CharIndex。如果数据不包含问号,则charindex函数将返回一个比字符串长度大1的值,这对于左函数非常有效。     ,
SELECT
    CASE
        WHEN CHARINDEX(\'?\',url) > 0 THEN SUBSTRING(Url,1,CHARINDEX(\'?\',url) - 1)
        ELSE Url
    End As PageOnly
FROM
    TableName
    ,这将为您提供所有唯一的URL,以及每个URL记录的次数。
select UrlOnly,COUNT(*) as CountTimes
from
(
select
    case
    when URL like \'%?%\' then STUFF(URL,charindex(\'?\',URL),LEN(URL),\'\')
    else URL
    end as UrlOnly
from tbl
) X
group by UrlOnly
    ,您将希望将SUBSTRING与CHARINDEX函数结合使用,因此您的SQL查询将类似于
SELECT SUBSTRING([PageColName],[PageColName])) AS \'Page\',LoadTime 
  FROM [TableName]
将[PageColName]替换为具有页面的列的名称,并将[TableName]替换为要查询的表的名称,并且应该对其进行设置。     ,像这样 LEFT(fieldName,CHARINDEX(\'。aspx \',fieldName)+ 5) 您不需要IF语句,因为您的示例中每个URL都有一个ASPX扩展名。