我有一个如下表:
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 个类别,如下所示:
- 火狐
- 边缘
- IE
- Chrome
- Safari
- 其他
我尝试像下面这样做:
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
类别。我花了太多时间来找出解决方案,但我做不到。
编辑
I can't use
CLR Assembly RegEx Functions
如果有人能够解释此问题的解决方案,将会非常有帮助。
最佳答案
您的问题的技术答案是,在 SQL case 语句中,第一个命中 true 的响应会逃脱其余的条件检查。您可以按照从最严格到最不严格的顺序检查条件,然后您将能够获得您想要的输出。
但是,这并不是一个很好的解决方案。用户代理不可靠或不可预测 - 而且还有很多 https://udger.com/resources/ua-list .
您还有另一个问题,即您正在字符串中间进行搜索。这将使该查询非常昂贵,并且一旦您达到大量记录,查询就会非常慢。
最好在插入记录时解析用户代理,以便在进行搜索/计数时,可以优化它以使用索引。
关于SQL Server从navigator.userAgent检测其他浏览器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50487055/