SQL Server : Select rows with multiple occurrences of regex match in a column

标签 sql sql-server regex

我相当习惯使用 MySQL,但对 SQL Server 不是特别熟悉。运气不好,我在这里处理的数据库位于 SQL Server 2014 上。

我有一个表,其中有一列,其值都是带有前导、分隔和尾随分号的整数,就像这三个虚构的行:

;905;1493;384;13387;29;933;467;28732;
;905;138;3084;1387;290;9353;4767;2732;
;9085;14493;3864;130387;289;933;4767;28732;

我现在要做的是选择此列中出现从数字列表中获取的多个数字的所有行。例如,给定上面的三行,如果我有组 905,467,4767,我试图弄清楚如何构造的语句应该返回前两行:第一行包含 905 467;第二行包含 905 和 4767。第三行仅包含 4767,因此不应返回该行。

As far as I can tell ,SQL Server实际上并不直接支持正则表达式(我什至不知道托管代码是什么),这没有帮助。即使使用正则表达式,我也不知道从哪里开始。 Oracle好像有a function that would be very useful ,但这就是 Oracle。

此处大多数类似的问题涉及查找同一字符(通常是单数)的多个实例,并通过 replacing the string to match with nothing and counting the difference in length 解决问题。 。我认为这在技术上也适用于这里,但是给定一个由 15 个数字组成的“过滤器”组,SELECT 语句将变得非常长、令人费解且完全不可读。此外,我只想匹配整个数字(因此,如果要匹配的数字之一是29,则第一行中的值29将匹配,但第二行中的值290不应匹配) ,这意味着我必须在 REPLACE 子句中包含分号,然后在计算长度时对它们进行折扣。一团乱。

我理想中想做的是这样的:

SELECT * FROM table WHERE REGEXP_COUNT(column, ';(905|467|4767);') > 1

——但由于各种原因,这显然行不通(最明显的一个是 Oracle 外部不存在 REGEXP_COUNT)。

是否有一些明智的、可管理的方法来做到这一点?

最佳答案

你可以做到

SELECT *
FROM   Mess
       CROSS APPLY (SELECT COUNT(*)
                    FROM   (VALUES (905),
                                   (467),
                                   (4767)) V(Num)
                    WHERE  Col LIKE CONCAT('%;', Num, ';%')) ca(count)
WHERE  count > 1 

SQL Fiddle

或者另一种选择

WITH Nums
     AS (SELECT Num
         FROM   (VALUES (905),
                        (467),
                        (4767)) V(Num))
SELECT Mess.*
FROM   Mess
       CROSS APPLY (VALUES(CAST(CONCAT('<x>', REPLACE(Col, ';', '</x><x>'), '</x>') AS XML))) x(x)
       CROSS APPLY (SELECT COUNT(*)
                    FROM   (SELECT n.value('.', 'int')
                            FROM   x.x.nodes('/x') n(n)
                            WHERE  n.value('.', 'varchar') <> ''
                            INTERSECT
                            SELECT Num
                            FROM   Nums) T(count)
                    HAVING COUNT(*) > 1) ca2(count) 

关于SQL Server : Select rows with multiple occurrences of regex match in a column,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47020955/

相关文章:

python - 正则表达式有额外的斜杠

sql - MYSQL(或任何 RDBMS)中的 SQL MODE 是什么?

mysql - SQL 使用 unix 时间戳计算一个月内的记录

sql-server - Azure 移动服务后端 "mssql"未找到对象

java - 如何减少 hibernate 集合的索引大小(使用复合元素设置)?

excel - 如何匹配重音字符而不是制表符

SQL 查找非空列

JSON 包含空数组的 MySQL

sql-server - 连接到 SQL Server 时,OLEDB/ODBC 驱动程序有什么区别?

php - 正则表达式:如何验证路径不包含//