проверка полей электронной почты/почтового индекса в sql/oracle

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

Спасибо


person Community    schedule 24.04.2009    source источник


Ответы (5)


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

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

person dpbradley    schedule 24.04.2009
comment
спасибо, это полезно - я только что наткнулся на некоторую информацию об оракуле, которая связана с вашим советом по проверке reg-выражения 10g или выше - oracle.com/technology/oramag/webcolumns/2003/techarticles/ - person ; 25.04.2009
comment
@oej ссылка выше была удалена - person Dylan Czenski; 22.02.2017

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

'[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 [email protected]
         2 [email protected]
         3 [email protected]
         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
---------------------------------------- ------------------------------
[email protected]                           [email protected]
[email protected]                             [email protected]
[email protected]                     [email protected]
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
----------------------------------------
[email protected]
[email protected]
[email protected]

Найдите страницу содержания справочника по SQL для regexp, чтобы увидеть поддержку регулярных выражений.

person Neil Kodner    schedule 25.04.2009
comment
Это регулярное выражение не будет работать для адресов электронной почты, использующих TLD .museum и .travel. - person Luke Woodward; 25.04.2009
comment
консультирование@[email protected] передает это регулярное выражение и не должно - person Jay Rizzi; 27.04.2016

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

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

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

без якорей такие выражения, как «[email protected] какой-то другой текст», будут проверены, и, если вы пытаетесь проверить одно электронное письмо, приведенная выше строка не должна проверяться.

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

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

person Helder Gramacho    schedule 19.09.2011

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

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

'^[a-zA-Z0-9!#$%''\*\+-/=\?^_`\{|\}~]+@[a-zA-Z0-9._%-]+\.[a-zA-Z]{2,4}$'
person Wilfried Loche    schedule 05.03.2012

Как уже упоминалось, вы можете использовать регулярное выражение для проверки электронных писем, но с ограниченной точностью. Возможно, вам будет удобнее использовать такую ​​службу, как Настоящая электронная почта, для проверки электронных писем, которая не только проверяет, правильно ли выглядит электронная почта. , но если домен и учетная запись действительны.

Вы можете экспортировать свои данные в формате csv, а затем проверить их. Подробнее см. Как проверять электронные письма в sql база данных.

person Stephen    schedule 20.09.2020