【问题标题】:Oracle : removing certain characters from stringOracle:从字符串中删除某些字符
【发布时间】:2021-04-12 12:37:20
【问题描述】:

我们必须使用 SQL 或 PL/SQL 从 VARCHAR2 和 CLOB 数据类型中删除某些字符并加载到目标表中。

Oracle 中有一些可用的函数(例如 REGEXP_REPLACE 或 SUBSTR)可以使用。

但是,我们有大量的数据。

如果我们将数据提取到 Linux 主机并使用 TR ( /bin/tr ) 和 Oracle 外部文件的组合会更快吗?

【问题讨论】:

  • 可能有一些工具可以比 Oracle 更快地完成替换。问题是你想麻烦导出和重新导入吗?
  • 您可以使用数据子集进行基准测试,以确保确定。我的猜测是,将所有数据写入磁盘并将其全部读回所需的时间要比通过改进更新过程获得的任何速度提升要长得多。但是,如果您要更改 90% 的数据并优化卸载和加载过程,也许您可​​以加快速度。
  • 您可能需要考虑一种解决方案,例如使用视图和生成的列来隐藏数据。这不需要更改实际数据——更新大量行需要很长时间。
  • 如果只需要删除一些字符,不管它们出现在字符串中的什么位置,都应该使用REPLACE(不是任何正则表达式函数;至于SUBSTR,我看不到你将如何使用它来完成这项任务)。我认为您可以做的任何事情都不会比在数据库中使用 REPLACE 更快。如果您需要 translate 而不是 remove,则同样如此;您可以在数据库中使用TRANSLATE 函数。

标签: sql oracle plsql


【解决方案1】:

我通常使用TRANSLATE(参见:https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/TRANSLATE.html#GUID-80F85ACB-092C-4CC7-91F6-B3A585E3A690)从字符串中删除字符。但这有点取决于您要删除多少个字符。

以下示例旨在说明这一点。从输入字符串中删除字符“D”和“E”。

SELECT TRANSLATE('ABCDEFG', '_DE', '_') FROM DUAL;

它返回“ABCFG”。

'ABCDEFG' 是输入字符串。 '_DE' 表示 'D' 和 'E' 被删除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-03
    • 1970-01-01
    • 2013-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    相关资源
    最近更新 更多