服务器无法识别自定义类型文字
Server does not recognize a custom type literal
我在 postgres 中创建了一个自定义类型:
CREATE TYPE semanticversion AS (
major integer,
minor integer,
patch integer,
prerelease text,
prerelease_number integer);
并填充了一些数据 (select * from TABLE order by id
):
id | version
----+-------------
1 | (1,0,0,,)
2 | (2,0,0,,)
3 | (1,2,3,,)
4 | (1,2,3,b,1)
5 | (1,2,3,d,1)
6 | (1,2,3,h,1)
当我按此字段订购时,它按预期工作 (select * from TABLE order by version
):
id | version
----+-------------
1 | (1,0,0,,)
4 | (1,2,3,b,1)
5 | (1,2,3,d,1)
6 | (1,2,3,h,1)
3 | (1,2,3,,)
2 | (2,0,0,,)
但是当我尝试截断 (select * from TABLE where version < (1,2,3,'h',1)
) 时,它会抛出一个错误:
ERROR: cannot compare dissimilar column types text and unknown at record column 4
我觉得这很混乱,因为它显然能够比较这些值,否则就无法成功排序它们。
不确定 WHERE 子句中的 h
应该引用什么,但除此之外它似乎对我有用。
richard=> SELECT * FROM t ORDER BY v;
v
-------------
(1,0,0,"",)
(1,1,0,"",)
(1,2,0,a,1)
(3 rows)
richard=> SELECT * FROM t WHERE v < (1,1,1,'',null);
v
-------------
(1,0,0,"",)
(1,1,0,"",)
(2 rows)
类型转换机制需要两次通过才能隐式解决这种情况。使用显式转换之一:
where version < (1,2,3,'h'::text,1)
-- or
where version < (1,2,3,'h',1)::semanticversion
-- or
where version < '(1,2,3,h,1)'::semanticversion
我在 postgres 中创建了一个自定义类型:
CREATE TYPE semanticversion AS (
major integer,
minor integer,
patch integer,
prerelease text,
prerelease_number integer);
并填充了一些数据 (select * from TABLE order by id
):
id | version
----+-------------
1 | (1,0,0,,)
2 | (2,0,0,,)
3 | (1,2,3,,)
4 | (1,2,3,b,1)
5 | (1,2,3,d,1)
6 | (1,2,3,h,1)
当我按此字段订购时,它按预期工作 (select * from TABLE order by version
):
id | version
----+-------------
1 | (1,0,0,,)
4 | (1,2,3,b,1)
5 | (1,2,3,d,1)
6 | (1,2,3,h,1)
3 | (1,2,3,,)
2 | (2,0,0,,)
但是当我尝试截断 (select * from TABLE where version < (1,2,3,'h',1)
) 时,它会抛出一个错误:
ERROR: cannot compare dissimilar column types text and unknown at record column 4
我觉得这很混乱,因为它显然能够比较这些值,否则就无法成功排序它们。
不确定 WHERE 子句中的 h
应该引用什么,但除此之外它似乎对我有用。
richard=> SELECT * FROM t ORDER BY v;
v
-------------
(1,0,0,"",)
(1,1,0,"",)
(1,2,0,a,1)
(3 rows)
richard=> SELECT * FROM t WHERE v < (1,1,1,'',null);
v
-------------
(1,0,0,"",)
(1,1,0,"",)
(2 rows)
类型转换机制需要两次通过才能隐式解决这种情况。使用显式转换之一:
where version < (1,2,3,'h'::text,1)
-- or
where version < (1,2,3,'h',1)::semanticversion
-- or
where version < '(1,2,3,h,1)'::semanticversion