проверка по полям электронной почты / почтового индекса в sql / oracle - PullRequest
3 голосов
/ 24 апреля 2009

Буду признателен за несколько советов по следующим вопросам: возможно ли проверить поля электронной почты и почтовый индекс с помощью какого-либо ограничения проверки в SQL в Oracle? или такого рода вещи, как я подозреваю, pl / sql с регулярными выражениями?

Спасибо

Ответы [ 5 ]

8 голосов
/ 25 апреля 2009

Вот синтаксис регулярного выражения для адреса электронной почты, включая кавычки

'[a-zA-Z0-9._%-]+@[a-zA-Z0-9._%-]+\.[a-zA-Z]{2,4}'

Таким образом, вы можете использовать regexp_like () в предложении where или regexp_substr (), чтобы проверить, содержит ли ваше поле действительный адрес электронной почты. Вот пример - вы увидите, что regexp_substr () возвращает NULL по адресу, пропущенному .domain, что не проходит проверку подстроки. Оттуда вы можете создать проверочное ограничение вокруг него или применить его с помощью триггера (фу) и т. Д.

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 , чтобы увидеть поддержку регулярных выражений.

4 голосов
/ 19 сентября 2011

еще лучшее регулярное выражение:

^[a-zA-Z0-9._%-]+@[a-zA-Z0-9._%-]+\.[a-zA-Z]{2,4}$

(то же выражение дано, но привязано к началу (^) и концу ($) строки)

без якорей, выражения вроде «test1@hotmail.com какой-то другой текст» будет подтвержден, и, если вы пытаетесь проверить одно письмо, приведенная выше строка не должна проверять

Примечание: электронная почта должна быть предварительно обрезана, чтобы начальные или конечные пробелы не испортит проверку.

Надеюсь, это поможет,

2 голосов
/ 05 марта 2012

Будьте осторожны с символом '.': это джокер (например, * или % в синтаксисе SQL). Вы должны удалить его с '\'.

Вот регулярное выражение, которое я использую для соответствия RFC2822 (возможно, не во всех случаях:)):

'^[a-zA-Z0-9!#$%''\*\+-/=\?^_`\{|\}~]+@[a-zA-Z0-9._%-]+\.[a-zA-Z]{2,4}$'
1 голос
/ 25 апреля 2009

Если вас интересует только США, существует несколько источников почтовых индексов, которые вы можете получить в формате плоского файла и импортировать в таблицу, а затем применить ограничение внешнего ключа в своих адресах к этой таблице.

Адреса электронной почты могут сопоставляться с регулярным выражением (необходимо 10g или выше) для проверки формата, но проверка на предмет того, являются ли они действительными адресами, является гораздо более сложной задачей.

0 голосов
/ 24 января 2017
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;    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...