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_e
、something_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'
您需要的是类型转换,以便PostgreSQL's type resolution rules 可以找到合适的运算符。
这可以是显式转换:
... WHERE CAST(something AS text) = 'OPEN'
或者您创建隐式类型转换:
CREATE CAST (something_e AS text) WITH INOUT AS IMPLICIT;
然后您可以使用您的查询而无需显式转换。
我在我的 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_e
、something_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'
您需要的是类型转换,以便PostgreSQL's type resolution rules 可以找到合适的运算符。
这可以是显式转换:
... WHERE CAST(something AS text) = 'OPEN'
或者您创建隐式类型转换:
CREATE CAST (something_e AS text) WITH INOUT AS IMPLICIT;
然后您可以使用您的查询而无需显式转换。