This creates a function named hashjson that transforms the
json to texts and generates a hash
CREATE OR REPLACE FUNCTION hashjson(
json
) RETURNS INTEGER LANGUAGE SQL STRICT IMMUTABLE AS $$
SELECT hashtext($1::text);
$$;
This creates a function named json_eq that checks equality (as text)
CREATE OR REPLACE FUNCTION json_eq(
json,
json
) RETURNS BOOLEAN LANGUAGE SQL STRICT IMMUTABLE AS $$
SELECT bttextcmp($1::text, $2::text) = 0;
$$;
This creates an operator from the equality function
CREATE OPERATOR = (
LEFTARG = json,
RIGHTARG = json,
PROCEDURE = json_eq
);
Finaly, this defines a new default JSON operator family with the
operators and functions we just defined.
CREATE OPERATOR CLASS json_ops
DEFAULT FOR TYPE json USING hash AS
OPERATOR 1 =,
FUNCTION 1 hashjson(json);
我经历了同样的问题,然后我尝试了joachimjablon的代码,虽然它看起来很好用,但仍然存在问题。我要说到这里,最长的版本is on my blog。在
SELECT '{"a":1,"b":2}'::json = '{"b":2,"a":1}'::json
返回false
,因为它基于字符串表示。在然后,我在PL/V8中创建了一个
json_cmp()
函数,该函数可用于增强btree所需的运算符。在下面是完整的SQL脚本
当然,这比简单的字符串比较慢得多,但是它的优点是可以产生更可靠的结果。在
请注意,如果您使用South进行迁移,则可以创建一个空迁移并从
forwards()
方法执行SQL。这将在您迁移应用程序时自动安装这些功能。在我遇到了同样的问题,最后(今天)在psql控制台中以admin的身份运行了一个伪操作符:
(深受this线程的启发)
我在django jsonfield GitHubissue中也提到了你的问题。在
注意:
我的解决方案使用PL/Python,它解析并重新转储排序键的json,然后生成结果的fnf1a散列:https://github.com/ifad/chronomodel/blob/master/sql/json_ops.sql。在
我没有使用hashtext(),因为它仅供内部使用:http://www.postgresql.org/message-id/24463.1329854466@sss.pgh.pa.us。在
这不是一颗银弹,只是一个粗糙的黑客。真正的解决办法是等待Postgres的全面支持。在
相关问题 更多 >
编程相关推荐