替换字符串中的所有字符。

3

我希望将字符串中的所有字符替换为 "*" 星号字符。

例如:

NAME_SURNAME : ANDREY KIMBELL
REPLACED     : ****** *******

我该如何在Oracle PL/SQL中实现这个功能?

你为什么想要一个存储过程?(PL/SQL = 存储过程) - user330315
我想在程序块中使用。 - Mehmet
使用 TRANSLATE。它总是比正则表达式更快。 - Lalit Kumar B
5个回答

9
你可以使用以下方法: 演示
SELECT REGEXP_REPLACE('ANDREY KIMBELL', '\w', '*')
FROM dual

其中,\w 是字母数字字符和下划线符号_ 的等效形式,相当于[A-Za-z0-9_]

如果仅为字母:

SELECT REGEXP_REPLACE('ANDREY KIMBELL1', '[[:alpha:]]', '*')
FROM dual

1
哇,我已经尝试使用 \w 参数了。数字和字母数字已被替换。非常感谢。 - Mehmet

3
你可以这样做:

像这样

select regexp_replace('abdcde123fge','[A-Za-z]','*') 
from dual;

这将用 * 替换 a-z 和 A-Z 范围内的所有内容。


lad2025的回答更加聪明简洁。 - Mehmet

0
你可以使用TRANSLATE函数:
SELECT TRANSLATE(UPPER('Andrey Kimbell'),
                 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
                 '**************************')
  FROM DUAL

祝你好运。


0
一个使用TRANSLATE函数的正则表达式功能的替代方案是:
SELECT TRANSLATE('ANDREY KIMBELL1', 
                 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 
                 '****************************************************')
FROM   dual;

在执行TRANSLATE之前,我故意没有使用UPPER功能,因为这会引入第二个函数并使速度变慢。

ETA:有人试图通过编辑我的答案来指出,而不是评论它,结果表明TRANSLATE比使用regexp_replace要慢 - 看起来我看到的差异是由于在PL / SQL中进行上下文切换。或者其他什么。

无论如何,以下演示了我现在看到的内容:

set timing on

create table timing_regexp_replace
as
SELECT REGEXP_REPLACE(owner||' '||table_name||' '||column_name, '[[:alpha:]]', '*') col1
from dba_tab_columns;

create table timing_translate
as
SELECT TRANSLATE(owner||' '||table_name||' '||column_name, 
                 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
                 '****************************************************') col1
from dba_tab_columns;

它返回:

Table created.
Elapsed: 00:00:00.96
Table created.
Elapsed: 00:00:02.87

-1
SELECT REGEXP_REPLACE('ANDREY KIMBELLasd123[]{}', '.', '*')
FROM dual;

2
请先查看此链接 如何回答问题这个问题之前已经有人回答过了,显然你可以在此处添加你的答案。但是在回答之前需要理解一些要点。首先,不要添加与先前添加的相同代码或建议的答案。其次,如果用户非常明确地询问了问题及其解决方法,请不要添加过于复杂的答案。第三,如果您想就答案或问题提出任何建议,可以添加评论。 - always-a-learner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接