比较开放 SQL 中 4 个字段的重复项

Compare duplicates for 4 fields in open SQL

我想比较打开的 4 个字段是否有重复 SQL。

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

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

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

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

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

您的问题的关键是分别检查所有带有前导和尾随“%”的名称部分,并根据名称部分的总和检查数据库条目的总大小:

字段 = ('%' + N1 + '%') AND 字段 = ('%' + N2 + '%') AND 字段 = ('%' + N3 + '%') AND 字段 = ( '%' + N4 + '%') 和长度(字段)= 长度(N1+N2+N3+N4)

这将找到一个匹配项。您可以使用它来 SELECT 名称的规范化连接,并使用 GROUP BY 和 HAVING count(*)>1 来搜索重复项。

如果用户不关心顺序,而你想检查是否重复,那么我认为以下条件似乎符合你的标准。

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.

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