问题
I'm creating a database in db2 and I want to add a constrain to validate whether the user inserting a valid email address, that contain %@%.% . Without luck...any advice?
回答1:
You can use LIKE with wildcards. See here for the wildcards on DB2.
The underscore character ( _ ) represents any single character.
The percent sign character (%) represents a string of zero or more characters.
SELECT email
FROM YourTable
WHERE email NOT LIKE '%_@__%.__%'
This will ignore the following cases (simple version for valid emails):
- emails that have at least one character before the @;
- emails that have at least two characters between @ and .;
- emails that have at least two characters between . and the end.
You can see an example in MySql in sqlfiddle.
To add it as a constraint, you do (as mustaccio said in a comment):
alter table your_table add constraint chk_email check (email like '%_@__%.__%')
回答2:
You could create a trigger that checks the given string with a regular expression that describes the structure of an email
^[A-Za-z0-9]+@[A-Za-z0-9]+.[A-Za-z0-9]+$
However, the regular expression of an email is not easy to define: Using a regular expression to validate an email address
DECLARE RET VARCHAR(32);
SET RET = XMLCAST (
XMLQUERY ('fn:matches($TEXT,"^[A-Za-z0-9]+@[A-Za-z0-9]+.[A-Za-z0-9]+$")'
PASSING TEXT AS "TEXT"
) AS VARCHAR(32));
Once you have the value of RET (true or false) you can do something in the trigger.
You can test the regular expression you want to use from command line:
db2 "xquery fn:matches(\"johndoe@mail.com\",\"^[A-Za-z0-9]+@[A-Za-z0-9]+.[A-Za-z0-9]+$\")"
来源:https://stackoverflow.com/questions/19154453/how-to-write-a-query-to-ensure-email-contains