`

Oracle 的 REPLACE 和 REGEXP_REPLACE

 
阅读更多

REPLACE 函数是用另外一个值来替代串中的某个值。例如,可以用一个匹配数字来替代字母的每一次出现。REPLACE 的格式如下所示:

  1. REPLACE ( char, search_string [, replace_string]) 

如果没有指定replace_string 变量的值,那么当发现search_string 变量的值时,就将其删除。输入可以为任何字符数据类型——CHAR、VARCHAR2、NCHAR、NVARCHAR2、CLOB或NCLOB。下面是一个示例:

  1. REPLACE('GEORGE', 'GE', 'EG') = EGOREG  
  2. REPLACE('GEORGE', 'GE', NULL) = OR 

如果搜索串的长度不为零,则可以知道搜索串在某个串中出现的次数。首先,计算源串的长度:

  1. LENGTH('GEORGE') 

然后,计算源串删除搜索串以后的长度:

  1. LENGTH(REPLACE('GEORGE', 'GE', NULL)) 

接着用搜索串的长度除以两次的长度之差,就可以得到搜索串出现的次数:

  1. select LENGTH('GEORGE')  
  2. - LENGTH(REPLACE('GEORGE', 'GE', NULL))  
  3. /  
  4. LENGTH('GE') AS Counter  
  5. from DUAL;  
  6. COUNTER  
  7. ------- 

REGEXP_REPLACE 函数在几个方面扩展了REPLACE 函数的功能。它支持在搜索模式中使用正则表达式,也支持本章前面描述的变量,即position、occurrence 和match_parameter,从而可以选择只替代某些匹配的值,或者不区分大小写。REGEXP_REPLACE 函数的语法如下所示:

  1. REGEXP_REPLACE( source_string, pattern  
  2. [, replace_string  
  3. [, position  
  4. [, occurrence  
  5. [, match_parameter ]  
  6. ]  
  7. ]  
  8. ]  

除了replace_string,这里所有的变量都已经在本章前面章节作了介绍。replace_string 告诉Oracle 用什么来替代source_string 中与pattern 匹配的部分。occurrence 变量是一个非负整数,它指定操作的次数:如果为0,则所有的匹配项都被替代;如果指定一个正数,则Oracle替代第n 次匹配。

考虑ADDRESS 表中的Phone 列。首先,寻找格式为###-###-#### 的号码。该格式分为3 部分,分别是3 个数字的集合、后面是另3 个数字的一个集合,然后又是4 个数字的一个集合,中间用‘-’符号隔开。通过在REGEXP_SUBSTR 函数调用中查找那些数字集合,可以找到与该标准匹配的行:

  1. select REGEXP_SUBSTR (Phone,  
  2. '([[:digit:]]{3})-([[:digit:]]{3})-([[:digit:]]{4})'  
  3. ) "REGEXP_SUBSTR"  
  4. from ADDRESS;  
  5. REGEXP_SUBST  
  6. ------------  
  7. 213-555-0223  
  8. 415-555-7530  
  9. 214-555-8383  
  10. 312-555-1166  
  11. 707-555-8900  
  12. 312-555-1414  
  13. 415-555-6842  
  14. 415-555-2178  
  15. 415-555-7387  
  16. 415-555-7512  
  17. 415-555-6252  
  18. 617-555-0125  
  19. 603-555-2242  
  20. 202-555-1414  
  21. 718-555-1638  
  22. 214-555-8383  
  23. 503-555-7491 

现在,使用REGEXP_REPLACE 把前3 个数字放在圆括号内,同时省略第一个‘-’符号。为此,我们将第1 个数字集称为 \1,第2 个数据集称为 \2,第3 个数据集称为\3。

  1. select REGEXP_REPLACE (Phone,  
  2. '([[:digit:]]{3})-([[:digit:]]{3})-([[:digit:]]{4})'  
  3. , '(\1) \2-\3'  
  4. ) "REGEXP_REPLACE"  
  5. from ADDRESS;  
  6. REGEXP_REPLACE  
  7. ------------------------------------------  
  8. (213) 555-0223  
  9. (415) 555-7530  
  10. (214) 555-8383  
  11. (312) 555-1166  
  12. (707) 555-8900  
  13. (312) 555-1414  
  14. (415) 555-6842  
  15. (415) 555-2178  
  16. (415) 555-7387  
  17. (415) 555-7512  
  18. (415) 555-6252  
  19. (617) 555-0125  
  20. (603) 555-2242  
  21. (202) 555-1414  
  22. (718) 555-1638  
  23. (214) 555-8383  
  24. (503) 555-7491 

输出说明了REGEXP_REPLACE 函数调用的结果,即区号用圆括号括起来,第一个'-'被去掉。

为了说明occurrenc 变量的工作原理,下面的REGEXP_REPLACE 函数调用是用句点来替代电话号码中的第二个'5':

 

  1. select REGEXP_REPLACE (Phone,  
  2. '5', '.',  
  3. 1, 2  
  4. ) "REGEXP_REPLACE"  
  5. from ADDRESS;  
  6. REGEXP_REPLACE  
  7. ------------------------------------------  
  8. 213-5.5-0223  
  9. 415-.55-7530  
  10. 214-5.5-8383  
  11. 312-5.5-1166  
  12. 707-5.5-8900  
  13. 312-5.5-1414  
  14. 415-.55-6842  
  15. 415-.55-2178  
  16. 415-.55-7387  
  17. 415-.55-7512  
  18. 415-.55-6252  
  19. 617-5.5-0125  
  20. 603-5.5-2242  
  21. 202-5.5-1414  
  22. 718-5.5-1638  
  23. 214-5.5-8383  
  24. 503-.55-7491 

可以进一步修改该查询语句,排除前3 个可能匹配的数字(开始位置设为4),并替代第4次出现:

 

  1. select REGEXP_REPLACE (Phone,  
  2. '5', '.',  
  3. 4, 4  
  4. ) "REGEXP_REPLACE"  
  5. from ADDRESS;  
  6. REGEXP_REPLACE  
  7. ------------------------------------------  
  8. 213-555-0223  
  9. 415-555-7.30  
  10. 214-555-8383  
  11. 312-555-1166  
  12. 707-555-8900  
  13. 312-555-1414  
  14. 415-555-6842  
  15. 415-555-2178  
  16. 415-555-7387  
  17. 415-555-7.12  
  18. 415-555-62.2  
  19. 617-555-012.  
  20. 603-555-2242  
  21. 202-555-1414  
  22. 718-555-1638  
  23. 214-555-8383  
  24. 503-555-7491 

通过在where 子句中使用REGEXP_INSTR,可以限制返回的行。在本例中,只显示那些至少含有4 个‘5’的行(从第4 个字符开始)。因为该搜索模式并不复杂,所以这里也可以使用INSTR 函数。

  1. select REGEXP_REPLACE (Phone,  
  2. '5', '.',  
  3. 4, 4  
  4. ) "REGEXP_REPLACE"  
  5. from ADDRESS  
  6. where REGEXP_INSTR(Phone, '5',4,4) > 0;  
  7. 415-555-7.30  
  8. 415-555-7.12  
  9. 415-555-62.2  
  10. 617-555-012. 

可以使用该功能来搜索可供选择的值,从而在单个查询中组合使用多个查询标准。在下面的示例中,可以替代5 或者2;‘5’和‘2’的出现次数都记入occurrence 统计量中:

  1. select REGEXP_REPLACE (Phone,  
  2. '(5|2)', '.',  
  3. 4, 4  
  4. ) "REGEXP_REPLACE"  
  5. from ADDRESS  
  6. where REGEXP_INSTR(Phone, '(5|2)',4,4) > 0;  
  7. REGEXP_REPLACE  
  8. ------------------------------------------  
  9. 213-555-0.23  
  10. 415-555-7.30  
  11. 415-555-684.  
  12. 415-555-.178  
  13. 415-555-7.12  
  14. 415-555-6.52  
  15. 617-555-01.5  
  16. 603-555-.242 

由于该示例中出现的‘|’符号是一个可选的运算符,因此,匹配两个指定值中任何一个都将返回一行。关于正则表达式中支持的更多运算符,请参阅表8-1。

 

出自:http://book.51cto.com/art/201007/212287.htm

分享到:
评论

相关推荐

    mysql_regexp_replace.zip_oracle

    Oracle 的 `REGEXP_REPLACE` 函数接受三个参数:源字符串、正则表达式模式和替换字符串。例如,`REGEXP_REPLACE('test string', 't', 'T')` 将返回 'Test string',将所有小写 't' 替换为大写 'T'。Oracle 还提供了...

    Oracle分析函数基本概念和语法总结及Regexp_***用法

    4. `REGEXP_REPLACE`:使用正则表达式替换字符串中的一部分。 5. `REGEXP_COUNT`:计算字符串中符合正则表达式的子串数量。 例如,如果你想找出所有以数字开头的名字: ```sql SELECT ename, REGEXP_LIKE(ename, '...

    oracle_10g正则表达式_REGEXP_LIKE_用法

    在Oracle 10g数据库系统中,正则表达式的引入为数据检索提供了更为灵活和强大...此外,结合其他正则表达式相关的函数,如`REGEXP_INSTR`, `REGEXP_SUBSTR`, 和`REGEXP_REPLACE`,可以实现更复杂的数据清洗和转换任务。

    oracle正则表达式regexp_like的用法详解

    REGEXP_LIKE :与LIKE的功能相似2,REGEXP_INSTR :与INSTR的功能相似3,REGEXP_SUBSTR :与SUBSTR的功能相似4,REGEXP_REPLACE :与REPLACE的功能相似它们在用法上与Oracle SQL 函数LIKE、INSTR、SUBSTR 和REPLACE ...

    mysql-udf-regexp:实现REGEXP _...()函数MySQL用户定义函数模块

    REGEXP_REPLACE?(text, pattern, replace [,position [,occurence [,return_end [,mode]]]) 这些函数支持与MySQL REGEXP运算符相同的正则表达式语法,如MySQL手册的正则表达式附录中所述。 这些功能在名称上与...

    ORACLE正则表达式

    ORACLE 正则表达式的使用(REGEXP_LIKE REGEXP_INSTR REGEXP_SUBSTR REGEXP_REPLACE)

    Oracle 总结的正则表达式带有详细的例子与解释

    4. `REGEXP_REPLACE(srcstr, pattern, replacement [, position [, occurrence [, match_option]]])`:用`replacement`替换`srcstr`中符合`pattern`的部分,`position`、`occurrence`和`match_option`选项与之前函数...

    Oracle正则表达式函数全面解析

    本文将详细介绍Oracle数据库中支持的四个主要正则表达式函数:`REGEXP_LIKE`、`REGEXP_INSTR`、`REGEXP_SUBSTR`和`REGEXP_REPLACE`,以及如何使用POSIX正则表达式。 #### 二、Oracle正则表达式基础 ##### 1. POSIX...

    oracle字符串替换

    ### Oracle字符串替换:使用REGEXP_REPLACE函数 在Oracle数据库中,对字符串进行处理是一项非常常见的需求,尤其是在数据清洗、格式转换等场景下。本文将详细介绍如何利用`REGEXP_REPLACE`函数来实现字符串替换功能...

    Oracle正则表达式函数

    Oracle数据库系统提供了强大的正则表达式功能,这些功能主要通过一系列内置函数来实现,使得数据库查询和数据处理变得更加灵活和高效。在Oracle中,正则表达式主要用于模式匹配和字符串操作,广泛应用于数据验证、...

    Oracle正则表达式详解(用法+实例)

    Oracle 10g 引入了一系列新的函数来支持正则表达式的使用,包括 `REGEXP_LIKE`、`REGEXP_INSTR`、`REGEXP_SUBSTR` 和 `REGEXP_REPLACE`。这些函数的使用方式类似于传统的 SQL 函数 `LIKE`、`INSTR`、`SUBSTR` 和 `...

    sql中判断某列是否为数字.docx

    Oracle 中的支持正则表达式的函数主要有四个:REGEXP_LIKE、REGEXP_REPLACE、REGEXP_INSTR 和 REGEXP_SUBSTR。这四个函数在用法上与 Oracle SQL 函数 LIKE、INSTR、SUBSTR 和 REPLACE 用法相同,但它们使用 POSIX ...

    oracle正则表达式.ppt

    Oracle支持四种与正则表达式相关的函数:REGEXP_LIKE、REGEXP_INSTR、REGEXP_SUBSTR和REGEXP_REPLACE。 1. REGEXP_LIKE:此函数用于执行基于正则表达式的模糊匹配。与传统的LIKE操作符不同,它能处理更复杂的匹配...

    Oracle 正则表达式介绍

    在Oracle 10g版本中,正则表达式得到了进一步的支持,引入了新的SQL操作符REGEXP_LIKE以及与之相关的函数REGEXP_INSTR、REGEXP_SUBSTR和REGEXP_REPLACE。 1. 正则表达式的基本概念: 正则表达式由字符字面量和元...

    解决Oracle没有WM_CONCAT函数.zip

    SELECT REGEXP_REPLACE(SYS_CONNECT_BY_PATH(column, ','), '^,', '') AS aggregated_column FROM (SELECT column, CONNECT_BY_ROOT rowid as rid FROM table) START WITH rid = (SELECT MIN(rowid) FROM table) ...

    oracle正则表达式

    Oracle中的正则表达式主要通过内置的SQL函数来实现,如REGEXP_LIKE、REGEXP_SUBSTR、REGEXP_REPLACE等。这些函数使得用户能够以更复杂的方式匹配、提取和替换字符串,极大地增强了SQL查询的灵活性。 `REGEXP_LIKE` ...

    oracle 10g 新特性

    在Oracle 10g中,新增加了四个用于支持正则表达式的SQL函数:`REGEXP_LIKE`、`REGEXP_INSTR`、`REGEXP_SUBSTR`和`REGEXP_REPLACE`。这些函数使用POSIX标准的正则表达式语法,替代了传统的通配符`%`和`_`,使得用户...

    Oracle中正则表达式的使用实例教程

    Oracle使用正则表达式离不开这4个函数:regexp_like、regexp_substr、regexp_instr、regexp_replace。 regexp_like 该函数只能用于条件表达式,和 like 类似,但是使用的正则表达式进行匹配 //查询所有包含小写...

    Oracle正则表达式

    Oracle中的正则表达式功能主要通过内置函数REGEXP_LIKE、REGEXP_SUBSTR、REGEXP_REPLACE等来实现。 1. REGEXP_LIKE函数: 这个函数在SQL查询中用于判断一个字符串是否符合特定的正则表达式模式。它的基本语法是: ...

Global site tag (gtag.js) - Google Analytics