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

标签 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') 

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

  1. 火狐
  2. 边缘
  3. IE
  4. Chrome
  5. Safari
  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 类别。我花了太多时间来找出解决方案,但我做不到。

编辑

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/

相关文章:

mysql - 备份mysql服务器中的数据库

java - 如何从 catch 语句中的 Java 异常对象中检索多个 SSMS 查询错误消息?

asp.net-mvc - 是否有针对任何智能手机的用户代理检测代码?

javascript - 在 javascript 中检测 Lion (OS X 10.7)?

mysql - SQL - 按满足条件的数量排序

python - 为另一列中的每个值生成相等长度的行(使用 Python 或 SQL)

mysql - 评论回复查询(倒序)

.net - 值不能为空,参数名称 : dataTable

sql-server - Oracle 到 MSSQL 迁移错误 'The table xxx doesnot exist in target'

php - 如何使用php阻止一些http用户代理