3

我在日志解析器中使用 case 语句来找出浏览器名称,例如 case strcnt(cs(user-agent), 'MSIE') when 1 THEN 'IE'

但是一些用户代理字段不止一次有'MSIE',有没有办法检查> = 1

case strcnt(cs(user-agent), 'MSIE') 当 >=1 THEN 'IE'

或者

strcnt(cs(user-agent), 'MSIE') >=1 THEN 'IE' 的情况

我试过这些语句iis给出语法错误。

请提供一些其他解决方法来检查不止一个事件.. 谢谢

4

4 回答 4

4

这就是我的样子......它似乎不支持多个 when's 所以你需要嵌套它们

case strcnt(cs(user-agent), 'iPhone') WHEN 1 THEN 'iPhone' ELSE 
    case strcnt(cs(user-agent), 'Android') WHEN 1 THEN 'Android' ELSE
        case strcnt(cs(user-agent), 'iPad') WHEN 1 THEN 'iPad' ELSE 
            'Other'
        END
    END
END
于 2016-06-07T13:21:52.020 回答
0

注意:Log Parser 的实际发布版本支持如下所示的 CASE 语句形式。@Gabrielle Guiseppe 在评论中提到了这一点。


该语句有两种形式CASE——一种只允许你做等式(你正在使用的那个),另一种允许你使用任何表达式:

SELECT CASE WHEN STRCNT(cs(user-agent), 'MSIE') >=1 THEN 'IE' ELSE 'FOO' END

还要注意语句END末尾的 ...的使用。CASE

另一种选择是:

SELECT CASE WHEN INDEX_OF(cs(user-agent), 'MSIE') IS NOT NULL THEN 'IE' WHEN INDEX_OF(cs(user-agent), 'Google') IS NOT NULL THEN 'CHROME' ELSE 'UNKNOWN' END

于 2013-07-26T11:45:45.067 回答
0

我遇到了同样的问题,但是在用户代理字符串中重复了 iPhone。例如:

Mozilla/5.0+(iPhone;+CPU+iPhone+OS+10_2_1+like+Mac+OS+X)+AppleWebKit/602.4.6+(KHTML,+like+Gecko)+Version/10.0+Mobile/14D27+Safari/602.1

我的解决方案是使用REPLACE_IF_NOT_NULL函数,并利用INDEX_OF如果未找到搜索字符串则返回 null 的事实:

...     
case REPLACE_IF_NOT_NULL(INDEX_OF(cs(user-agent),'iPhone'),1) when 1 THEN 'iPhone' else
case REPLACE_IF_NOT_NULL(INDEX_OF(cs(user-agent),'iPad'),1) when 1 THEN 'iPad' else
case REPLACE_IF_NOT_NULL(INDEX_OF(cs(user-agent),'Android'),1) when 1 THEN 'Android' else
...

使用这种格式比在其他示例中看到的使用 strcnt(...) 构造的等效查询慢约 10%,但它解决了 iPhone 问题,我相信通常更健壮。

于 2017-07-20T21:32:08.860 回答
-1

我解决这个问题的方法是使用多个 when 关键字

CASE strcnt(TO_LOWERCASE(User-Agent),'mobile') when 1 THEN 'Mobile' when 2 THEN 'Mobile' when 3 THEN 'Mobile' else CASE strcnt(TO_LOWERCASE(User-Agent),'feed')  when 1 THEN 'Feed'  when 2 THEN 'Feed'   when 3 THEN 'Feed' ELSE 'Normal' End End 

这涵盖了最多出现 3 次的 word mobile。

于 2014-09-23T09:03:05.130 回答