sql - 如何用 • 替换单词但仅显示第一个和最后一个字符

标签 sql regex oracle plsql

用oracle中的符号替换单词,但保留第一个和最后一个字符。

我尝试了REGEXP_REPLACE('ANNE MARRY', '(\w)\w', '\1*')

我希望当我介绍“Anne Marry”时,我的查询返回“A••e M•••y”

这就是REGEXP_REPLACE解决方案吗?

最佳答案

Oracle 不支持使用单个正则表达式解决此问题所需的语法。

您可以使用简单的字符串函数和递归子查询,无需正则表达式即可完成此操作:

WITH replacements (id, value, epos) AS (
  SELECT ROWNUM, value, 1 FROM table_name
UNION ALL
  SELECT id,
         CASE
         WHEN INSTR(value, ' ', epos) = 0 AND epos <= LENGTH(value) - 2
         THEN SUBSTR(value, 1, epos)
              || LPAD('•', LENGTH(value) - epos - 1, '•')
              || SUBSTR(value, -1)
         WHEN INSTR(value, ' ', epos) <= epos + 2
         THEN value
         ELSE SUBSTR(value, 1, epos)
              || LPAD('•', INSTR(value, ' ', epos) - epos - 2, '•')
              || SUBSTR(value, INSTR(value, ' ', epos) - 1)
         END,
         INSTR(value, ' ', epos) + 1
  FROM   replacements
)
SEARCH DEPTH FIRST BY id SET order_id
CYCLE id, epos SET is_cycle TO 1 DEFAULT 0
SELECT value
FROM   replacements
WHERE  is_cycle = 1;

对于示例数据:

CREATE TABLE table_name (value) AS
  SELECT 'ANNE MARRY' FROM DUAL UNION ALL
  SELECT 'XI NG' FROM DUAL UNION ALL
  SELECT 'A B C D E' FROM DUAL UNION ALL
  SELECT 'MAY' FROM DUAL;

输出:

<表类=“s-表”> <标题> 值 <正文> A••E M•••Y 习近平 A B C D E M•Y

fiddle

关于sql - 如何用 • 替换单词但仅显示第一个和最后一个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76320262/

相关文章:

mysql - 不在 [a-z] 和 [A-Z] 之前或之后的搜索词的正则表达式

javascript - 分割键 : value; pairs and exclude whitespace in matches

sql - 在oracle 11g中编译程序

php - 无法选择 * (ORA-00932 : inconsistent datatypes: expected CHAR got ADT)

sql - 我想要最多多列

mysql - 从外部删除mysql中的表

sql - 将多个 Excel 文件/工作表导入 SQL 表

mysql - MySQL 中用于统计未读消息的子查询

javascript - 在 JavaScript 中获取正则表达式的重复次数

javascript - 如何将日期字符串转换为具有不同日期格式的时间戳?