我有一张如下表:
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个类别:
我试着这样做:
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
如果有人能解释这个问题的解决方案,将会非常有帮助。
答案 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'