Oracle删除重复字符

Posted

技术标签:

【中文标题】Oracle删除重复字符【英文标题】:Oracle remove repeating characters 【发布时间】:2014-10-07 10:37:40 【问题描述】:

为了实现密码复杂性,我需要一个可以删除重复字符的函数(以便生成满足密码复杂性要求的密码)。所以像 weeeeee1 这样的字符串是不允许的,因为 e 是重复的。我需要一个函数来代替返回 we1,其中重复字符已被删除。必须使用 Oracle PL/SQL 或直接 sql。

我找到了Oracle SQL -- remove partial duplicate from string,但这不适用于我的 weeeeee1 测试用例,因为它只替换为一次迭代,因此返回 weee1。

我不是要测试没有重复的字符。我正在尝试将重复字符串更改为非重复字符串。

【问题讨论】:

删除字符会不会有不符合其他要求的风险,特别是最小长度?如果一开始就看不到它是如何生成的,那么丢弃任何未通过任何测试的生成值并重新开始可能会更简单;取决于它们失败的频率、生成它们需要多长时间、是否能提供可接受的性能等等...... 真的是we1weeeeee1 更安全的密码吗?!? 我将使用一个随机生成的数字。唯一的问题是删除可能的重复字符。所以长度和安全性不是问题。 【参考方案1】:

我认为您可以使用 regexp_replace 实现您的目标。还是我错过了什么?

select regexp_replace(:password, '(.)\1+','\1') 
  from dual;

这是一个例子:

with t as (select 'weeee1' password from dual
           union select 'wwwwweeeee11111' from dual
           union select 'we1' from dual)

select regexp_replace(t.password, '(.)\1+','\1') 
  from t;

制作:

REGEXP_REPLACE(T.PASSWORD,'(.)\1+','\1')
we1
we1
we1

【讨论】:

【参考方案2】:

试试这个:

select regexp_replace('weeeeee1', '(.)\1+', '\1') val from dual

VAL
---
we1

【讨论】:

我不想测试没有重复的字符。我正在尝试将重复字符串更改为非重复字符串。【参考方案3】:

大概,

    使用返回值(weee1)再次检查替换

    取出单词的每个字母并检查整个单词是否存在超过 1 个。

【讨论】:

这个答案并不独立 - 您可以添加更多信息以便它可以单独处理这个问题吗?

以上是关于Oracle删除重复字符的主要内容,如果未能解决你的问题,请参考以下文章

从oracle中的字符串中删除重复的子字符串

Oracle 替换一些重复的字符(非数字)

如何通过 Oracle 中的正则表达式从逗号分隔列表中删除重复项,但我不想要重复值? [复制]

oracle删除重复的行怎么删啊

oracle删除重复的行怎么删啊

oracle之如何删除表中的重复记录只保留其中一条