SQL Server从navigator.userAgent检测其他浏览器

时间:2018-05-23 11:18:41

标签: sql sql-server user-agent

我有一张如下表:

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') 
UserAgent客户端用户填写了

navigator.userAgent。我想将记录分类为以下6个类别:

  1. Firefox
  2. Edge
  3. IE
  4. Safari浏览器
  5. 其他
  6. 我试着这样做:

    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

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

3 个答案:

答案 0 :(得分:1)

对该问题的技术解答是,在SQL case语句中,第一个为true的响应会转义其余的条件检查。您可以按照从严格到最小的顺序检查条件,然后可以获得所需的输出。

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

还有另一个问题,您正在字符串中间进行搜索。这将使该查询非常昂贵,并且一旦您创下实质记录,它就会非常慢。

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

答案 1 :(得分:0)

我对你的预期产出做了一些假设:

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)

答案 2 :(得分:0)

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

<块引用>

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

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'