【问题标题】:Cast to custom domain PostgreSQL投射到自定义域 PostgreSQL
【发布时间】: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


    【解决方案1】:

    来自the documentation:

    对域类型的强制转换当前无效。向域转换或从域转换使用与其基础类型关联的转换。

    在创建演员表时会收到警告:

    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
    

    【讨论】:

    • 你知道我是否可以使用 CHECK 而不是 DOMAIN 创建 TYPE 吗?
    • 您需要通过在 C 中创建输入和输出函数来扩展 Postgres 来实现这一点。我宁愿在检查中使用带有区分大小写的正则表达式 ([A-Za-z0-9]) 的域。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    • 2021-05-24
    • 2017-10-19
    • 2019-08-17
    相关资源
    最近更新 更多