SQL查找LIKE记录的重复项

时间:2020-05-27 16:04:35

标签: sql db2

我需要找到“喜欢”记录的重复项。这就是我的意思。

我将目录号作为字符,例如“ abc123”或“ a1b2c3” 生产突然开始将这些填充到10个位置,因此新的id会作为0000abc123 因此,他们可以参加将数据放入其中的竞赛,并且在技术上是独一无二的。

我需要做的是查找所有未填充和已填充之间具有匹配项的记录。

我已经尝试过

SELECT p.sku, COUNT(p.id)
FROM  products p
GROUP BY p.sku
HAVING COUNT(p.id) > 1

哪个可以给我带来重复的次数(有用,但不够有用)

我认为我需要一个UNION,但不清楚如何进行。 感谢您的任何帮助

所以用英语陈述

查找所有长度为10的记录,并找到其他最右边的字符与长度为10的记录的最右边字符匹配的记录。

如此

00000asdfg would match 'asdfg' but would not match 'sdfg'

我想我想匹配左侧不是'0'的任何字符

DB2 v10

2 个答案:

答案 0 :(得分:1)

您可以先填充id,然后很容易找到重复项。例如:

select
  pid
from (
  select
    sku,
    id,
    lpad(id, 10, '0') as pid
  from products
) x
group by pid
having count(pid) > 1

请参见DB<>Fiddle上的运行示例。

您没有提到DB2数据库的架构(iSeries,LUW,z / OS)。如果您的体系结构中没有LPAD(),则可以使用REPEAT()RIGHT()的组合来获得相同的结果。例如:

select
  pid
from (
  select
    sku,
    right(repeat('0', 10) || id, 10) as pid
  from products
) x
groub by pid
where count(pid) > 1

答案 1 :(得分:1)

使用自我加入:

SELECT p1.id, p1.sku, p2.sku matching_sku
FROM products p1 LEFT JOIN products p2
ON p2.sku = TRIM(LEADING '0' FROM p1.sku)  
WHERE LENGTH(p1.sku) = 10

此查询将通过删除前导sku返回所有包含长度为10的sku行和所有匹配的0行。

相关问题