Ale*_*rov 6 sql postgresql types casting
我正在尝试创建自定义域类型来强制对多个表进行约束。
约束工作正常,但我还想添加自定义转换,该转换将在实际转换和检查之前应用小写。
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;
Run Code Online (Sandbox Code Playgroud)
域和函数都按预期工作
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'
Run Code Online (Sandbox Code Playgroud)
但强制转换无法转换大写
SELECT 'ABC@abc.com' :: email; -- gives an error
Run Code Online (Sandbox Code Playgroud)
我将不胜感激任何想法,谢谢。
从文档中:
目前,与域类型之间的转换没有任何效果。与域之间的转换使用与其基础类型关联的转换。
创建演员阵容时会收到警告:
CREATE CAST ( text AS email )
WITH FUNCTION text_as_email(text) AS IMPLICIT;
WARNING: cast will be ignored because the target data type is a domain
Run Code Online (Sandbox Code Playgroud)