2011-04-14 12 views
1

私は、私のページからの応答時間を示すログでいっぱいのSQLテーブルを持っています。例:T-SQLのフィールドからクエリーストリングを取り除く方法は?

/MyPage1.aspx 
/MyPage2.aspx 
/MyPage3.aspx?index=4 
/MyPage3.aspx?index=5 
/MyPage3.aspx?index=7 

ただし、各ページの平均読み込み時間を表示するビューを作成したいとします。これを行うには、クエリー文字の前にURLでページをグループ化したいので、クエリー文字列を含めたくないので(/MyPage3.aspxが1回だけ表示されます)

ここでは、クエリ文字列を取り除くのにどのような文字列関数が適していますか?この

LEFT(フィールド名、CHARINDEX( 'ASPX'、フィールド名)+ 5)

あなたはあなたの例のすべてのURLは、ASPXの拡張子を持っているので、IF文を必要としないような

答えて

5

ここに難しい部分は....データには必ずしも「?マーク。あなたは?の位置を見つけることができますか? charindexを使用しますが、その左側のデータを選択するには、CharIndex - 1を使用する必要があります。 charIndexは0を返し、Left(データ、0-1)はエラーを返します。

単純な解決策は、常にCharIndexが見つけるものがあることを確認することです。このように:

Select Left(URL, CharIndex('?', URL + '?')-1) 
From @Temp 

URL + '?'のCharIndexを実行していることに注目してください。データに疑問符が含まれていない場合、charindex関数は、左の関数でうまく動作する文字列の長さよりも大きな値1を返します。

+0

おめでとう、素敵なトリック! – jaraics

0

これにより、すべての一意のURLと、それぞれが記録された回数が表示されます。

あなたのSQLクエリが

SELECT SUBSTRING([PageColName], 0, CHARINDEX('?', [PageColName])) AS 'Page', 
     LoadTime 
    FROM [TableName] 

ページを持っているあなたの列の名前を[PageColName]置き換えのようになりますので、CHARINDEX機能と連動してSUBSTRINGを使用したいと思うでしょう

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 
0

、[TableName]のように、照会しているテーブルの名前を入力すると、設定する必要があります。

+0

?のある行に対して正しい結果が返されません。はURLに存在しません。 –

2
SELECT 
    CASE 
     WHEN CHARINDEX('?', url) > 0 THEN SUBSTRING(Url, 1, CHARINDEX('?', url) - 1) 
     ELSE Url 
    End As PageOnly 
FROM 
    TableName 
関連する問題