在审查完这个答案之后,我创建了以下自定义运算符:
CREATE OR REPLACE FUNCTION is_not_distinct_from(
ANYELEMENT,
ANYELEMENT
)
RETURNS BOOLEAN AS
$$
SELECT $1 IS NOT DISTINCT FROM $2;
$$
LANGUAGE sql
IMMUTABLE;
CREATE OPERATOR =!= (
PROCEDURE = is_not_distinct_from(anyelement,anyelement),
LEFTARG = anyelement,
RIGHTARG = anyelement,
COMMUTATOR = =!=,
NEGATOR = <!>
);
CREATE OR REPLACE FUNCTION is_distinct_from(
ANYELEMENT,
ANYELEMENT
)
RETURNS BOOLEAN AS
$$
SELECT $1 IS DISTINCT FROM $2;
$$
LANGUAGE sql
IMMUTABLE;
CREATE OPERATOR <!> (
PROCEDURE = is_distinct_from(anyelement,anyelement),
LEFTARG = anyelement,
RIGHTARG = anyelement,
COMMUTATOR = <!>,
NEGATOR = =!=
);
我有一个表格,允许两个NULL
值,并且我想防止重复记录,将NULL
视为一个值。
CREATE TABLE "Foo" (
"FooID" SERIAL PRIMARY KEY,
"Foo" TEXT NOT NULL,
"Bar" TIMESTAMPTZ
"Baz" TIMESTAMPTZ
EXCLUDE ("Foo" WITH =, "Bar" WITH =!=, "Baz" WITH =!=)
);
我遇到了以下错误:
ERROR: operator =!=(anyelement,anyelement)不是“datetime_ops”运算符族的成员 DETAIL: 排除运算符必须与约束的索引运算符类相关联。
我已经查看了文档(此处和此处),但我很难理解材料。
此外,这个问题可能被认为是重复的问题;然而,那个问题的问题是与其他RDBMS兼容性的问题... 这个问题具体讨论如何处理上述错误。
btree_gist
扩展的timestamp
的GiST实现在这里和这里,这只是为了让你了解一下你要做的事情。 - Nick Barnes