2013-07-24 2 views
2

я использую высказывание регистра в Log Parser, чтобы узнать имена браузера, как, случая strcnt (CS (агент пользователя), «MSIE»), когда 1 THEN «IE»Log Parser саз

Но некоторые полей пользовательского агента имеют «MSIE» более одного раза, есть ли способ проверить> = 1

case strcnt (cs (user-agent), 'MSIE'), когда> = 1 THEN 'IE'

или

случай, когда strcnt (CS (агент пользователя), 'MSIE')> = 1 ТОГДА 'IE'

Я пробовал эту инструкцию iis, дающую синтаксическую ошибку.

Пожалуйста, дайте какой-нибудь другой обходной путь, чтобы проверить более чем один .. вхождение Спасибо

ответ

0

Есть две формы CASE заявления - одно, что только позволяет делать equaility (тот, который вы используете) и один что позволяет использовать любое выражение:

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

+0

Какая версия logparser является вторым вариантом, который должен работать? Я на 2,2.10, и я несколько раз пытался попробовать такой запрос для анализа без ошибок. – beavel

+0

Оба запроса используют один и тот же синтаксис оператора CASE, поэтому, если первый работает для вас, второй также должен. Какую ошибку вы получаете точно? –

+0

Чтобы быть ясным, я никогда не могу получить оператор CASE, который позволяет любому выражению работать.Чтобы проверить, я взял ваш тестовый пример и попытался запустить следующее: «LogParser -i: W3C -o: CSV» SELECT CASE WHEN INDEX_OF (cs (user-agent), «MSIE») НЕ ЯВЛЯЕТСЯ ТОЛЬКО «IE» КОГДА INDEX_OF (cs (user-agent), «Google») НЕ ЯВЛЯЕТСЯ «ХРОМ», «НЕИЗВЕСТНО» из C: \ logs \ * »', что приводит к ошибке: Ошибка синтаксиса: : ожидается WHEN ключевое слово вместо токена «INDEX_OF (cs (user-agent)», «Мне кажется, что он анализирует его как синтаксис равенства, поскольку есть КОГДА, предшествующий токену, о котором он жалуется. – beavel

-1

Так я решил это использовать несколько ключевых слов, когда

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-х раз.

2

Это то, что шахта выглядит как ... Это, кажется, не поддерживать несколько, когда это так нужно гнездо их

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 
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 
... 

Используя этот формат провел около 10% медленнее, чем эквивалентный запрос, используя конструкцию strcnt (...), показанную в других примерах, но она решает проблему iPhone, и я считаю, что она, как правило, более надежна.

Смежные вопросы