【问题标题】:query to return all records that have a reoccuring string/number查询以返回具有重复出现的字符串/数字的所有记录
【发布时间】:2020-07-28 13:00:43
【问题描述】:

我正在寻求帮助,以查找由于输入管理不善而在属性中重复出现的字符串/数字的记录。例如,该表将类似于以下内容:

ID|stuff
1 | 23 jackson jackson st
2 | 89 jackson st
3 | 1 1 jackson st
4 | 66 jackson st

我希望返回如下所示:

ID|stuff
1 | 23 jackson jackson st
3 | 1 1 jackson st

请注意,在上面的示例中,'s' 不会导致它返回 id 2,即使它在 jackSon 和 St 中也是如此。

任何帮助将不胜感激,谢谢。

【问题讨论】:

  • 你想要的匹配总是连续重复吗?
  • 如果是jackson st jacksonjackson st st呢?
  • 无论您考虑哪种解决方案,都会遇到各种麻烦。会有一些你没有想到的情况,特别是如果你想删除不连续的重复模式。例如,如果您想从 12 jackson 12 street 中删除 12,那么您如何处理 12 jackson st apartment 12?另一个例子 - Walla Walla 是美国华盛顿州的一个城市,是否应该显示为 Walla
  • 对oracle不太熟悉,但是如果将它们分成列,然后使用rank函数对每个空格分隔的单词(按id分区)进行排名,使得重复的单词获得相同的排名,然后使用聚合过滤 count(rank) 不等于 count(distinct rank) 的 id,最后加入这些 id。
  • 是的,我知道 walla walla 会是个问题;然而,我们实际上会手动审查退货,如果它是合法的,就会离开它。这基本上是一个返回可能情况的查询,然后我们将手动查看。

标签: sql oracle


【解决方案1】:

您可以在 Oracle 正则表达式中使用反向引用。我认为这就是你想要的:

select *
from t
where regexp_like(' ' || stuff, ' ([^ ]+) .*\1');

Here 是一个 dbfiddle。

【讨论】:

  • 这将报告误报。例如:'3 s main st'。如果第一个“重复”的单词是剩余字符串中较长单词的sub字符串,则该字符串将匹配正则表达式。
  • 有什么办法可以绕过它吗?
  • 对于这个例子,在后面的引用后面加一个空格来匹配组后面的空格:' ([^ ]+) .*\1 '
  • @Gary_W - 假设第二次出现不在字符串的末尾。
  • @mathguy 你说得对,这个例子应该以( |$)结尾:' ([^ ]+) .*\1( |$)'
【解决方案2】:

使用这个WHERE 谓词

where regexp_like(stuff, '(^|\W)(\w+)($|\W).*\2')

请注意,初始组和跟踪组(^|\W)($|\W) 表示字符串的开始/结束非单词字符将分隔第二组 - 重复单词的第一个实例。

第二组被定义为(\w+)一个或多个字包

您可能还想使用\s(空白)而不是\W - 有关详细信息,请参阅here

此正则表达式返回的示例数据也用于非单词分隔符。

你也不应该低估标签和其他白色的东西,简单的解决方案会忽略

23 jackson jackson st
1 1 jackson st
68 jackson.st.jackson

另请参阅this 类似主题的回答。

【讨论】:

    猜你喜欢
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多