【问题标题】:SQL Server detect other browsers from navigator.userAgentSQL Server 从 navigator.userAgent 检测其他浏览器
【发布时间】:2018-05-23 11:18:41
【问题描述】:

我有一张如下表:

create table SiteLog (UserAgent nvarchar(255))
insert into SiteLog values 
('Mozilla/5.0 (iPad; CPU OS 9_3_2 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13F69 Safari/601.1'),
('Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0'),
('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586'),
('Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36'),
('Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.12 Safari/537.36 OPR/14.0.1116.4') 

UserAgentnavigator.userAgent 客户端用户填写。我想将记录分类为 6 个类别,如下所示:

  1. 火狐
  2. 边缘
  3. IE
  4. 野生动物园
  5. 其他

我尝试如下:

SELECT CASE 
         WHEN Charindex('Firefox', useragent) > 0 THEN 'Firefox' 
         WHEN Charindex('Edge', useragent) > 0 THEN 'Edge' 
         WHEN Charindex('Trident', useragent) > 0 
               OR Charindex('MSIE', useragent) > 0 THEN 'IE' 
         WHEN Charindex('Chrome', useragent) > 0 THEN 'Chrome' 
         WHEN Charindex('Safari', useragent) > 0 THEN 'Safari' 
         ELSE 'Other' 
       END 
FROM   SiteLog 

乍一看很简单,但正如您在sqlfiddle 中看到的那样,结果不正确,因为最后一条记录有Chrome,它被归类为Chrome 类别。我花了太多时间想办法解决这个问题,但我做不到。

编辑

我不能使用CLR Assembly RegEx Functions

如果有人能解释这个问题的解决方案,那将非常有帮助。

【问题讨论】:

  • 切换 Chrome 和 Safari WHEN 表达式?但是,SQL Server 真的是正确的工具吗?我很确定有专门设计用于读取和提供对 Web 日志文件的分析的工具。
  • 定义您的类别的规则是什么?第 3 行有 Chrome、Safari 和 Edge。首先考虑您想要的行为,然后继续执行。
  • @Larnu 切换 Chrome 和 Safari 并不适用于所有情况。你是对的,另一个工具填充了这个表,我知道 SQL Server 不适合这样做,但不幸的是我只有一个这样的表。
  • @EzLo 我考虑了我的代码,我看到了很多关于useragent 的模式。我根据useragent 模式排列了代码行。我可以用正则表达式在 JS 或 C# 中对它们进行分类,但以防万一,我的数据就是这张表,我应该在 SQL Server 中进行。

标签: sql sql-server user-agent


【解决方案1】:

您的问题的技术答案是,在 SQL 案例语句中,第一个达到 true 的响应会转义其余的条件检查。您可以按照最严格到最不严格的顺序检查条件,您将能够获得所需的输出。

但是,这不是一个很好的解决方案。用户代理不可靠或不可预测 - 还有很多 https://udger.com/resources/ua-list

您还有一个问题是在字符串中间进行搜索。这将使该查询非常昂贵,并且一旦您达到大量记录,它就会非常慢。

最好在插入记录时解析用户代理,以便在进行搜索/计数时可以优化它以使用索引。

【讨论】:

    【解决方案2】:

    我对您的预期输出做了一些假设:

    SELECT 
        SL.*
        ,a.a + b.b + c.c + d.d + e.e + z.z -- Format as you like
    FROM   SiteLog SL
                CROSS APPLY (SELECT CASE WHEN Charindex('Firefox', useragent) > 0 THEN ' Firefox' ELSE '' END) a(a)
                CROSS APPLY (SELECT CASE WHEN Charindex('Edge', useragent) > 0 THEN ' Edge'  ELSE '' END) b(b)
                CROSS APPLY (SELECT CASE WHEN Charindex('Trident', useragent) > 0  OR Charindex('MSIE', useragent) > 0 THEN ' IE' ELSE '' END) c(c)
                CROSS APPLY (SELECT CASE WHEN Charindex('Chrome', useragent) > 0 THEN ' Chrome'  ELSE '' END) d(d)
                CROSS APPLY (SELECT CASE WHEN Charindex('Safari', useragent) > 0 THEN ' Safari'  ELSE '' END) e(e)
                CROSS APPLY (SELECT CASE WHEN a.a + b.b + c.c + d.d + e.e = '' THEN ' Other' ELSE '' END) z(z)
    

    【讨论】:

      【解决方案3】:

      这对我有用。您应该能够传递您的 USER 代理数据并用它替换它

      Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,如 Gecko)Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.52

      SQL 代码:

      SELECT 
      CASE
          WHEN 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.52' LIKE '%Mac%OS%' THEN 'Mac OS X'
          WHEN 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.52' LIKE '%iPad%' THEN 'iPad'
          WHEN 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.52' LIKE '%iPod%' THEN 'iPod'
          WHEN 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.52' LIKE '%iPhone%' THEN 'iPhone'
          WHEN 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.52' LIKE '%imac%' THEN 'mac'
          WHEN 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.52' LIKE '%android%' THEN 'android'
          WHEN 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.52' LIKE '%linux%' THEN 'linux'
          WHEN 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.52' LIKE '%Nokia%' THEN 'Nokia'
          WHEN 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.52' LIKE '%BlackBerry%' THEN 'BlackBerry'
          WHEN 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.52' LIKE '%win%' THEN
              CASE
                  WHEN 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.52' LIKE '%NT 6.2%' THEN 'Windows 8'
                  WHEN 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.52' LIKE '%NT 6.3%' THEN 'Windows 8.1'
                  WHEN 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.52' LIKE '%NT 6.1%' THEN 'Windows 7'
                  WHEN 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.52' LIKE '%NT 6.0%' THEN 'Windows Vista'
                  WHEN 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.52' LIKE '%NT 5.1%' THEN 'Windows XP'
                  WHEN 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.52' LIKE '%NT 5.0%' THEN 'Windows 2000'
                  ELSE 'Windows'
              END      
          WHEN 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.52' LIKE '%FreeBSD%' THEN 'FreeBSD'
          WHEN 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.52' LIKE '%OpenBSD%' THEN 'OpenBSD'
          WHEN 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.52' LIKE '%NetBSD%' THEN 'NetBSD'
          WHEN 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.52' LIKE '%OpenSolaris%' THEN 'OpenSolaris'
          WHEN 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.52' LIKE '%SunOS%' THEN 'SunOS'
          WHEN 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.52' LIKE '%OS/2%' THEN 'OS/2'
          WHEN 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.52' LIKE '%BeOS%' THEN 'BeOS'
          ELSE 'Unknown'
      END AS 'os',
      CASE
          WHEN 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.52' LIKE '%edge%'THEN 'Edge'
          WHEN 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.52' LIKE '%MSIE%' THEN 'Internet Explorer'
          WHEN 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.52' LIKE '%Firefox%' THEN 'Mozilla Firefox'
          WHEN 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.52' LIKE '%Chrome%' THEN 'Google Chrome'
          WHEN 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.52' LIKE '%Safari%' THEN 'Apple Safari'
          WHEN 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.52' LIKE '%Opera%' THEN 'Opera' 
          WHEN 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.52' LIKE '%Outlook%' THEN 'Outlook' 
          ELSE 'Unknown'
      END AS 'Browser',
      CASE
          WHEN 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.52' LIKE '%WOW64%' THEN '64 bit'
          WHEN 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.52' LIKE '%x64%' THEN '64 bit'
          ELSE '32 bit'
      END AS 'BitArchitecture'
      

      【讨论】:

        猜你喜欢
        • 2012-09-23
        • 2011-01-14
        • 2011-07-27
        • 2011-04-19
        • 2011-09-24
        • 2011-07-25
        • 2012-12-30
        • 2013-03-03
        相关资源
        最近更新 更多