查询以查找遵循相同模式序列的记录?

时间:2016-11-11 07:50:23

标签: sql sql-server tsql sql-server-2008-r2

如何查找与下表中某些序列匹配的记录:

Window

如何按照以下模式获取记录

  1. 一个
  2. 1或更多b
  3. C

1 个答案:

答案 0 :(得分:2)

下面的代码会将您的数据转换为网站访问列表(ID),然后是表示访问过的网页的单个字符串(例如" abbbcd")。

       SELECT t2.id, max(tasks) as tasks from
        (
            SELECT t1.id, 
            (SELECT '' + Task FROM [Table] WHERE id = t1.id ORDER BY s_Id FOR XML PATH(''))  AS tasks
            from [Table] t1
        ) t2
        group by t2.id

所以问题现在减少到搜索字符模式:a - 任意数量的b - s - c。您可以使用LIKE执行此操作:

SELECT *
FROM (
        SELECT t2.id, max(tasks) as tasks from
        (
            SELECT t1.id, 
            (SELECT '' + Task FROM [Table] WHERE id = t1.id ORDER BY s_Id FOR XML PATH(''))  AS tasks
            from [Table] t1
        ) t2
        group by t2.id
    ) t3
WHERE t3.tasks LIKE '%abc%'
 OR t3.tasks LIKE '%abbc%'
  OR t3.tasks LIKE '%abbbc%' 
  OR t3.tasks LIKE '%abbbbc%';

这有点粗糙。你想说任意数量的b,但LIKE不支持。这是正则表达式(RegEx)通常用于的。表达式为" ab + c"代表:" a"接着是一个或多个" b" s,然后是" c"。

不幸的是,SQL Server不支持regex(Oracle确实如此),所以你必须使用CLR来实现它。其他人已为您完成此操作,因此您可以按照此处的说明进行安装:https://www.simple-talk.com/sql/t-sql-programming/clr-assembly-regex-functions-for-sql-server-by-example/