【发布时间】:2018-11-30 16:03:48
【问题描述】:
我正在尝试创建自定义域类型来强制约束多个表。
约束工作正常,但我还想添加自定义转换,在实际转换和检查之前应用小写。
CREATE DOMAIN email AS varchar(80)
CHECK (value ~ ('^[a-z0-9!#$%&''*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&''*+/=?^_`{|}~-]+)*@' ||
'(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$'));
CREATE OR REPLACE FUNCTION text_as_email(text)
RETURNS email
LANGUAGE SQL AS
$$ SELECT lower($1) :: email $$;
CREATE CAST ( text AS email )
WITH FUNCTION text_as_email(text) AS IMPLICIT;
领域和功能都按预期工作
SELECT 'abc@abc.com' :: email; -- no errors
SELECT 'abc@@abc.com' :: email; -- expected error
SELECT text_as_email('ABC@abc.com'); -- no errors, returns 'abc@abc.com'
但是强制转换无法大写
SELECT 'ABC@abc.com' :: email; -- gives an error
如果有任何想法,我将不胜感激,谢谢。
【问题讨论】:
标签: sql postgresql types casting