0

我想比较开放 SQL 中的 4 个字段是否存在重复项。

场景:用户有 4 个字段要输入。名字 (N1)、姓氏 (N2)、附加名字 (N3) 和附加姓氏 (N4)。

现在算法是这样工作的:它连接 N1 + N2 + % 和 N2+ N1 + %。因此,如果用户在任何字段中输入,查询将查找 N1N2% 或 N2N1%。这意味着对于 2 个字段,有 2 个!可能的组合。现在有了 2 个额外的字段,这个算法会爆炸,因为将有 4 个!要检查的组合。任何想法如何解决这个问题?

注意:我们进行这种组合检查是因为用户可以在任何给定的输入字段中输入数据。因此,我们检查所有字段组合。不幸的是,这无法改变。

编辑:我不能假设它以前以这种方式设计的顺序。因此,组合的并发症。

Edit2:我喜欢检查各个部分的想法。但我们想要做的理想是将所有字符串连接在一起并检查 DB 中的子字符串。在 open-sql 中,它使用 like 语句完成。我们的 DB 表已经为 N1+N2 组合存储了这样的连接字符串。现在需要将其扩展到 4 个字段。

4

2 回答 2

2

问题的关键是使用前导和尾随 '%' 分别检查所有名称部分,并根据名称部分的总和检查 db 条目的总大小:

字段 = ('%' + N1 + '%') AND 字段 = ('%' + N2 + '%') AND 字段 = ('%' + N3 + '%') AND 字段 = ('%' + N4 + '%') AND LENGTH(字段) = LENGTH(N1+N2+N3+N4)

这将找到匹配项。您可以使用它来选择名称的标准化串联,并使用 GROUP BY 和 HAVING count(*)>1 来搜索重复项。

于 2016-06-01T15:11:09.340 回答
0

如果用户不关心订单并且您想检查重复项,那么我认为以下条件似乎符合您的标准。

SELECT ...
  FROM ...
  INTO TABLE ...
  WHERE N1 IN (@INPUT_N1, @INPUT_N2, @INPUT_N3, @INPUT_N4)
    AND N2 IN (@INPUT_N1, @INPUT_N2, @INPUT_N3, @INPUT_N4)
    AND N3 IN (@INPUT_N1, @INPUT_N2, @INPUT_N3, @INPUT_N4)
    AND N4 IN (@INPUT_N1, @INPUT_N2, @INPUT_N3, @INPUT_N4).

IF sy-dbcnt > 0.
   "duplicates found, do something...
ENDIF.

当然,当数据库中有垃圾时,例如所有四个字段都相同,那么这将不会返回真正的重复。

于 2016-06-01T15:16:55.243 回答