ERROR: operator does not exist with custom domain

ERROR: operator does not exist with custom domain

我在我的 Postgres 12 数据库模式中有声明:

CREATE TYPE something_e AS ENUM('OPEN', 'CLOSE');
CREATE DOMAIN something_t AS something_e NOT NULL DEFAULT 'OPEN';
CREATE TABLE xxx (
...
something something_t,
...
);

而且 INSERT 似乎工作正常。但是 select - 不会:

INSERT INTO yyy (...) VALUES (..., (SELECT ID FROM xxx WHERE ... AND something='OPEN'));

这里我得到一个错误:

"ERROR: operator does not exist: something_t = unknown".

我尝试将类型转换为 something_esomething_t::,但没有成功。我什至收到类似“运算符不存在:something_t = something_t”这样的错误!我最初的想法是为了减少代码的重复,所以在枚举something_e的基础上引入这个something_t新域,但是现在如何select使用这样的标准呢? INSERT 似乎自动将 'OPEN' 字符串转换为 something_t...这种情况下正确的语法是什么?

您不能直接将字符串与自定义类型的值进行比较:

select * from xxx where something = 'OPEN';
-- ERROR: operator does not exist: something_t = unknown

您不能对自定义类型使用相等运算符:

select * from xxx where something = 'OPEN'::something_t;
-- ERROR: operator does not exist: something_t = something_t

可以,但是,将类型值转换为字符串,然后比较:

select * from xxx where something::text = 'OPEN'

Demo on DB Fiddle

您需要的是类型转换,以便PostgreSQL's type resolution rules 可以找到合适的运算符。

这可以是显式转换:

... WHERE CAST(something AS text) = 'OPEN'

或者您创建隐式类型转换:

CREATE CAST (something_e AS text) WITH INOUT AS IMPLICIT;

然后您可以使用您的查询而无需显式转换。