ORacle SQL正则表达式

时间:2016-01-16 16:02:36

标签: sql regex oracle

我希望为某些测试创建一些正则表达式代码。在下面我创建了一个电子邮件地址的约束检查。

     create table testemail (username varchar2(50) NOT NULL,
     Password varchar(15) Not NULL,
     CONSTRAINT pk_usertest PRIMARY KEY (username),
     CONSTRAINT un_emailtest CHECK (REGEXP_LIKE(username,'^([[:alnum:]]+)@[[:alnum:]]+.(com|net|org|edu|gov|mil)$'))

在新用户创建帐户时,是否有更好的方法进行约束检查?

另外,我试图以“Luke Haire”的名义搜索用户。但我的下面的SQL查询没有返回结果:

 select * from customers where regexp_like (name, '^([L(u|i|o)ke]+)[\][Haire]$');

2 个答案:

答案 0 :(得分:2)

我真的不明白你的第一个问题。检查约束是检查约束的最佳方法。这就是数据库支持它的原因。有更糟糕的方法,例如触发器,但通常最好的方法是使用这种内置的标准功能。

您的具体约束似乎太受限制了。电子邮件地址通常包含“。”和“ - ”也是。

至于第二个问题,问题是后缀。所以试试:

select *
from customers
where regexp_like(name, '^([L(u|i|o)ke]+)[\][Haire]@.*$');
---------------------------------------------------^

我应该补充一点,我更喜欢上面的等价物:

where regexp_like(name, '^([L(u|i|o)ke]+)[\][Haire]@');

问题在于likeregexp之间的区别。 like始终匹配整个字符串。所以,在大多数情况下,我更喜欢让正则表达式通过显式开头和结尾来模拟它。这是为了避免混淆。我使用更简单的搜索和更复杂的正则表达式。

但是,根据检查约束,我仍然希望这不会得到匹配,因为\不是@之前的允许字符。

答案 1 :(得分:1)

您的查询没有返回任何行,因为您的模式中有两个错误。

第二个预期字符,根据你的模式是\所以在字符列表中 你应该添加[\] 空格[\ ][\[:space:]]。 您缺少[Haire]角色列表的量词。 目前你的模式就像:

regexp_like ('Luke Haire', '^([L(u|i|o)ke]+)[\](H|a|i|r|e)$')

您的输入字符串的一种可能模式是:

 regexp_like (name, '^([L(u|i|o)ke]+)[\ ][Haire].*$')