使用正规表达式编写更好的 SQL[2]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 chensheng913 的 blog

接下来的例子演示了您如何能够在一次列检查约束条件中应用 regexp_like 操作符来进行数据验证。它在插入或更新时检验正确的社会保险号码格式。如 123-45-6789 和 123456789 之类格式的社会保险号码对于这种列约束条件是可接受的值。有效的数据必须以三个数字开始,紧跟着一个连字符,再加两个数字和一个连字符,最后又是四个数字。另一种表达式只允许 9 个连续的数字。竖线符号 (|) 将各个选项分开。

alter table students
  add constraint stud_ssn_ck check
  (regexp_like(ssn,
  '^([[:digit:]]{3}-[[:digit:]]{2}-[[:digit:]]{4}|[[:digit:]]{9})$'))

由 ^ 和 $ 指示的开头或结尾的字符都是不可接受的。确保您的正则表达式没有分成多行或包含任何不必要的空格,除非您希望格式如此并相应地进行匹配。表 12 说明了该正则表达式示例的各个组成部分。

将正则表达式与现有的功能进行比较

正则表达式有几个优点优于常见的 like 操作符和 instr、substr 及 replace 函数的。这些传统的 sql 函数不便于进行模式匹配。只有 like 操作符通过使用 % 和 _ 字符匹配,但 like 不支持表达式的重复、复杂的更替、字符范围、字符列表和 posix 字符类等等。此外,新的正则表达式函数允许检测重复出现的单词和模式交换。这里的例子为您提供了正则表达式领域的一个概览,以及您如何能够在您的应用程序中使用它们。

实实在在地丰富您的工具包

因为正则表达式有助于解决复杂的问题,所以它们是非常强大的。正则表达式的一些功能难于用传统的 sql 函数来仿效。当您了解了这种稍显神秘的语言的基础构建程序块时,正则表达式将成为您的工具包的不可缺少的一部分(不仅在 sql 环境下也在其它的编程语言环境下)。为了使您的各个模式正确,虽然尝试和错误有时是必须的,但正则表达式的简洁和强大是不容置疑的。

alice rischert (ar280@yahoo.com) 是哥伦比亚大学计算机技术与应用系的数据库应用程序开发和设计方向的主席。她编写了 oracle sql 交互手册 第 2 版(prentice hall,2002)和即将推出的 oracle sql 示例 (prentice hall,2003)。rischert 拥有超过 15 年的经验在财富 100 强公司内担任数据库设计师、dba 和项目主管,并且她自从 oracle version 5 起就一直使用 oracle 产品。

表 1:定位元字符

元字符说明
^使表达式定位至一行的开头
$使表达式定位至一行的末尾

表 2:量词或重复操作符

量词说明
*匹配 0 次或更多次
?匹配 0 次或 1 次
+匹配 1 次或更多次
{m}正好匹配 m
{m,}至少匹配 m
{m, n}至少匹配 m 次但不超过 n

表 3:预定义的 posix 字符类

字符类说明
[:alpha:]字母字符
[:lower:]小写字母字符
[:upper:]大写字母字符
[:digit:]数字
[:alnum:]字母数字字符
[:space:]空白字符(禁止打印),如回车符、换行符、竖直制表符和换页符
[:punct:]标点字符
[:cntrl:]控制字符(禁止打印)
[:print:]可打印字符

表 4:表达式的替换匹配和分组

元字符说明
|替换分隔替换选项,通常与分组操作符 () 一起使用
( )分组将子表达式分组为一个替换单元、量词单元或后向引用单元(参见“后向引用”部分)
[char]字符列表表示一个字符列表;一个字符列表中的大多数元字符(除字符类、^- 元字符之外)被理解为文字

表 5:regexp_like 操作符

语法说明
regexp_like(source_string, pattern
[, match_parameter])
source_string 支持字符数据类型(char、varchar2、clob、nchar、nvarchar2nclob,但不包括 long)。pattern 参数是正则表达式的另一个名称。match_parameter 允许可选的参数(如处理换行符、保留多行格式化以及提供对区分大小写的控制)。

表 6:regexp_instr 函数

语法说明
regexp_instr(source_string, pattern
[, start_position
[, occurrence
[, return_option
[, match_parameter]]]])
该函数查找 pattern ,并返回该模式的第一个位置。您可以随意指定您想要开始搜索的 start_positionoccurrence 参数默认为 1,除非您指定您要查找接下来出现的一个模式。return_option 的默认值为 0,它返回该模式的起始位置;值为 1 则返回符合匹配条件的下一个字符的起始位置。

本文关键:使用正规表达式编写更好的 SQL
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top