gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 03:15:06 27 4
gpt4 key购买 nike

我相当习惯使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com