将不胜感激以下方面的一些建议 - 是否可以通过 oracle 中的 sql 中的某种检查约束来验证电子邮件和邮政编码字段?还是我怀疑带有正则表达式的pl/sql这种事情?
谢谢
将不胜感激以下方面的一些建议 - 是否可以通过 oracle 中的 sql 中的某种检查约束来验证电子邮件和邮政编码字段?还是我怀疑带有正则表达式的pl/sql这种事情?
谢谢
这是电子邮件地址的正则表达式语法,包括引号
'[a-zA-Z0-9._%-]+@[a-zA-Z0-9._%-]+\.[a-zA-Z]{2,4}'
因此,您可以在 where 子句或 regexp_substr() 中使用 regexp_like() 来检查您的字段是否包含有效的电子邮件地址。这是一个示例 - 您将看到 regexp_substr() 在缺少 .domain 的地址上返回 NULL,这会导致子字符串验证失败。从那里你可以围绕它建立一个检查约束,或者使用触发器(yuck)等来强制它。
SQL> desc email
Name Null? Type
----------------------------------------- -------- ----------------------------
EMAIL_ID NUMBER
EMAIL_ADDRESS VARCHAR2(128)
SQL> select * from email;
EMAIL_ID EMAIL_ADDRESS
---------- ----------------------------------------
1 NEIL@GMAIL.COM
2 JOE@UTAH.GOV
3 lower_name@lower.org
4 bad_address@missing_domaindotorg
SQL> @qry2
SQL> column email_address format a40
SQL> column substr_result format a30
SQL> SELECT email_address
2 , regexp_substr(email_address,'[a-zA-Z0-9._%-]+@[a-zA-Z0-9._%-]+\.[a-zA-Z]{2,4}') substr_result
3 FROM email
4 /
EMAIL_ADDRESS SUBSTR_RESULT
---------------------------------------- ------------------------------
NEIL@GMAIL.COM NEIL@GMAIL.COM
JOE@UTAH.GOV JOE@UTAH.GOV
lower_name@lower.org lower_name@lower.org
bad_address@missing_domaindotorg
使用相同的数据,这是一个仅限制有效电子邮件地址的查询,使用 REGEXP_LIKE
SQL> column email_address format a40
SQL> column substr_result format a30
SQL> SELECT email_address
2 FROM email
3 WHERE REGEXP_LIKE (email_address, '[a-zA-Z0-9._%-]+@[a-zA-Z0-9._%-]+\.[a-zA-Z]{2,4}');
EMAIL_ADDRESS
----------------------------------------
NEIL@GMAIL.COM
JOE@UTAH.GOV
lower_name@lower.org
在SQL 参考的内容页面中搜索regexp 以查看对正则表达式的支持。
一个更好的正则表达式是:
^[a-zA-Z0-9._%-]+@[a-zA-Z0-9._%-]+\.[a-zA-Z]{2,4}$
(给出相同的表达式,但锚定到行的开始(^
)和结束($
))
如果没有锚点,将验证诸如“test1@hotmail.com some other text”之类的表达式,如果您尝试验证一封电子邮件,则上述字符串不应验证
注意:电子邮件应该事先被修剪,这样前导或尾随空格就不会搞砸验证。
希望能帮助到你,
注意'.'
字符:这是一个小丑(类似于*
SQL%
语法)。您必须使用'\'
.
这是我用来匹配RFC2822的正则表达式(可能不是所有情况 :)):
'^[a-zA-Z0-9!#$%''\*\+-/=\?^_`\{|\}~]+@[a-zA-Z0-9._%-]+\.[a-zA-Z]{2,4}$'
如果您只关心美国,您可以获取多个邮政编码来源,以平面文件格式获取并导入到表中,然后将地址中的外键约束应用于该表。
可以将电子邮件地址与正则表达式(需要 10g 或更高版本)进行匹配以验证格式,但检查它们是否是实际地址是一项更加困难的任务。
正如其他人所提到的,您可以使用正则表达式来验证电子邮件,但准确性有限。您可能会发现使用像Real Email这样的服务来验证电子邮件会更好,它不仅会检查电子邮件是否正确,还会检查域和帐户是否有效。
您可以将数据导出为 csv,然后对其进行验证。有关更多信息,请参阅如何验证 sql 数据库中的电子邮件。
declare
-- where customer is the table in my case
email_input customer.email%type;
begin
email_input:=:EMAIL;
IF email_input is not null
AND email_input not like '%@%.COM' then
message('Please enter a valid email address!');
message(' ');
clear_message;
:EMAIL:=null;
raise form_trigger_failure;
end if;
end;