Oracle db:如何在字符串的特定位置添加空格

Posted

技术标签:

【中文标题】Oracle db:如何在字符串的特定位置添加空格【英文标题】:Oracle db: How to add spaces in specific positions in strings 【发布时间】:2016-11-27 00:48:54 【问题描述】:

假设我有一个字符串 (varchar2),我想在有两个连续 a 的地方添加一个空格。例如:'graanh' -> 'gra anh'

好的,使用replaceregexp_replace 都可以轻松完成。但两人都因三个或更多连续的a而窒息。例如:

SQL> select replace('aaaaa', 'aa', 'a a') from dual;

REPLACE
-------
a aa aa

SQL> select regexp_replace('aaaaa', 'aa', 'a a') from dual;

REGEXP_
-------
a aa aa

这是因为对匹配模式的“下一个”匹配模式的搜索是在“上一个”匹配模式的结尾之后开始的。实际上,regexp_count('aaaaa', 'aa') 返回 2,而不是 4。

想要的结果是'aaaaa' -> 'a a a a a'

实际上,问题在于我不想替换模式'aa'。我要替换的是空字符串两侧的空字符串 BETWEEN a's。所以描述会是这样的:找到所有出现的空字符串,两边都有a,然后用空格替换那个空字符串。

这可以用字符串或正则表达式函数来完成吗?请不要提供带有递归查询的解决方案,或者(可怕的!)PL/SQL 过程;我知道他们可以做到,但我感兴趣的是是否有一个“自然”的解决方案,一个正好针对这个问题存在的工具,我错过了。

最坏的情况,replace(replace('aaaaa', 'aa', 'a a'), 'aa', 'a a') 可以解决问题。这也是最好的案例吗?

以免您认为这是一个奇怪的要求:我正在尝试使用不同的方法来拆分逗号分隔的字符串。一些方法有一个非常讨厌的习惯,即忽略此类字符串中的 NULL 标记(即,从两个连续的逗号中,您不会得到 NULL,因为您应该这样做)。因此,在使用这些方法之前,必须解析输入字符串并在连续的逗号之间添加一个空格或字符串“NULL”或其他内容。当然,最好在每个逗号之后(以及字符串的开头)添加一个空格,并且在拆分为标记之后,从每个标记的开头删除一个空格;但这提出了我上面提出的问题,我认为这本身就有优点。

谢谢!

编辑(2020 年 4 月 13 日)自从我第一次发布这个问题以来,我学到了很多关于正则表达式的知识。现在我知道了这个术语。 (我发现我给出的解释是正确的,我只是没有使用技术术语。)我们在这里需要的是lookarounds,能够在需要的地方一次性添加空格strong> - Oracle 正则表达式不支持它们。 结束编辑

【问题讨论】:

哈!当我找到这篇文章作为 FYI 提到一种解析允许空值的字符串的方法时,我注意到你编辑了它。 :-) ***.com/a/31464699/2543416 构建自己的内置函数怎么样?用 java 当然不是 PL/SQL? @J.Chomel - 我可以做到(在我学习 Java 之后);问题是,它会比两次调用replace 更有效吗?不知何故,我怀疑上下文切换会比调用replace 两次更昂贵。此外,我提出这个问题的主要目的是了解我是否缺少一些字符串函数或特性或技术。几个月后,我学到了更多,我相信这个更普遍的问题的答案是否定的。谢谢! 【参考方案1】:

如果您真的发现 PL/SQL 恐怖 和递归查询不自然,那么您可能必须使用 replace(replace('aaaaa', 'aa', 'a a'), 'aa', 'a a'),正如您已经提出的那样,尽管是“最坏的情况”。为什么你认为这是最糟糕的情况我仍然不清楚。

【讨论】:

明确一点:我一直都在使用递归查询,而且我知道至少有一种情况(实现 Eratosthenes 算法)PL/SQL 比普通 SQL 工作得好得多。我的意思是对于这个问题,递归 CTE 将是不自然的,并且 PL/SQL 是不必要的(因为它不可能允许比我已经提到的“最坏情况”更简单/更好的解决方案)。我只是不想看到 FOR 循环的解决方案。如果您能推荐一个比 replace(replace()) 更简单的递归 CTE 或 PL/SQL 解决方案,请务必提出建议。 我认为这是“最坏情况”,因为任何提供的解决方案都不应比它差(比“最坏情况”)。正如我在帖子中解释的那样,“最佳情况”将是搜索模式并允许替换该模式中的子模式的正则表达式(或类似)解决方案。抱歉,如果不清楚,我已尽力解释,但可能失败了。

以上是关于Oracle db:如何在字符串的特定位置添加空格的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中的某些位置向字符串添加空格

oracle中如何取消列值中的空格

oracle中如何取消列值中的空格

如何检查第一个字符是不是在输入“C”的特定位置

c#中特定位置的字符串替换

oracle sql查询以获取没有空格的列值