sql-server-2014 - 使用 T-SQL 通过匹配模式搜索重复项
问题描述
我试图在列中查找重复项,其中数据表示相同的内容,但在处理过程中未正确规范化。我已经建立了一个 # 表,其中包含两个要搜索的关键字段。我不想修剪或操作该列,我想按顺序恢复任何大于 8 个字符的匹配项。
示例数据:
ID Information
1 ABCDEF12.domain
2 domain.ABCDEF12
3 XYZABC123.22.26
4 222-XYZABC123-26
5 YYYYYYYYYYYYYYYY
6 AAAAAAAAAAAAAAAA
7 XYZABC123
8 ABCDEF12
9 123456789.1.2
将返回按长度最小排序:
ID Information
8 ABCDEF12
1 ABCDEF12.domain
2 domain.ABCDEF12
7 XYZABC123
3 XYZABC123.22.26
4 222-XYZABC123-26
实现这一目标的任何起点、最佳实践或任何指针都会很棒。我不确定如何最初识别具有 8 个或更多字符的共同值以缩小数据集,排序相对简单。
解决方案
这是一个解决方案。这使用了 Alan Burstein 的计数表 Number 函数
DECLARE @T1 TABLE ([ID] int, [Information] Nvarchar(16)) ;
INSERT INTO @T1 (ID ,Information)
VALUES
(1, N'ABCDEF12.domain'),
(2, N'domain.ABCDEF12'),
(3, N'XYZABC123.22.26'),
(4, N'222-XYZABC123-26'),
(5, N'YYYYYYYYYYYYYYYY'),
(6, N'AAAAAAAAAAAAAAAA'),
(7, N'XYZABC123'),
(8, N'ABCDEF12'),
(9, N'123456789.1.2')
;
SELECT DISTINCT
T.ID,T.Information
FROM @T1 T
CROSS APPLY dbo.getNums(1, LEN(T.Information), 1, 1) N
INNER JOIN
@T1 T1 ON ( SUBSTRING(T.Information, N, LEN(T.Information)) LIKE '%' + T1.Information + '%' OR
SUBSTRING(T1.Information, N, LEN(T1.Information)) LIKE '%' + T.Information + '%'
)
AND ( LEN(SUBSTRING(T1.Information, N, LEN(T1.Information))) > 8 OR
LEN(SUBSTRING(T.Information, N, LEN(T.Information))) > 8
)
AND T1.ID <> T.ID
输出
ID Information
4 222-XYZABC123-26
8 ABCDEF12
1 ABCDEF12.domain
2 domain.ABCDEF12
7 XYZABC123
3 XYZABC123.22.26
推荐阅读
- sql - Where oh Where(带变量的 VBA SQL Where 子句)
- linux - 不要杀死由 ps - linux 创建的已创建进程
- python - 如何绘制温度计?
- bash - 循环错误
- scala - Spark Streaming - 刷新静态数据
- java - 字符串的正则表达式在字符串之前和之后都有条件
- css - 如何在悬停时更改 datagridview 行的颜色?
- matlab - Matlab中的N维身份张量
- reactjs - 在 react-circular-progressbar 中为文本属性添加中断
- c++ - 获取之前使用 Rectangle() 函数绘制的矩形