我最近写了一个blog post关于为PostgreSQL的JSONB类型创建一个自定义的minus操作符。Postgres自定义运算符优先级高于内置?
基本上,运营商创建这样的:
CREATE OPERATOR - (
PROCEDURE = jsonb_minus,
LEFTARG = jsonb,
RIGHTARG = jsonb)
但是,作为一个评论者正确地指出,创建此操作后,默认JSONB - TEXT不工作了。此查询结果中的错误:
SELECT '{"a":1, "b":{"c":123, "d":"test"}}'::jsonb - 'a'
结果invalid input syntax for type json
。您必须明确地将第二个参数转换为TEXT才能使其工作。
下探运营商定制后,正常的行为被恢复,并且上面的查询给出了预期的结果:{"b": {"c": 123, "d": "test"}}
为什么会Postgres的尝试铸造JSONB在默认的文本没有指定明确的类型时?我能避免这种情况吗?
啊,打我几秒钟:-) 另一件要注意的是,你不能改变自定义运算符的优先顺序(你可以看到在某些语言中使用的解决方案)。 https://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-PRECEDENCE –