现在使用complete JSON operator set in pg9.4和JSONB类型,预计将使用JSONB作为“PostgreSQL代数”的一部分...而不是JSONB作为“孤立的宇宙”......
在性能方面,JSONB比JSON更快,因为内部“比JSON更强类型”......作为remembered here,“JSON操作比JSONB花费更多时间” 。所以JSONB在布尔,整数和数字类型的类型转换中可以更快......让我们走吧...... 我们不能,为什么不呢?
动机
需要一个函数get_jsonb_value(jsonb,field,type)
(或一组函数,如jbval_to_int()
,jbval_to_float()
,jbval_to_boolean()
),以使用JSONB内部表示,并执行更快的转换
编辑
如果PostgreSQL指南中不存在这种功能(请参阅下面的formal requeriment示例)(存在类似的东西?)并且它不在“下一个pg版本”中( 这是一个计划功能?)......问题是“如何在C中实现它,利用内部JSONB表示?”
CREATE FUNCTION jbval_to_numeric(JSONB, varchar) RETURNS numeric AS $f$
SELECT CASE
WHEN jsonb_typeof($1->$2)='number' THEN ($1->>$2)::numeric
ELSE NULL::numeric
END;
$f$ LANGUAGE sql IMMUTABLE;
CREATE FUNCTION jbval_to_float(JSONB, varchar) RETURNS float AS $f$
SELECT CASE
WHEN jsonb_typeof($1->$2)='number' THEN ($1->>$2)::float
ELSE NULL::float
END;
$f$ LANGUAGE sql IMMUTABLE;
CREATE FUNCTION jbval_to_int(JSONB, varchar, boolean DEFAULT true)
RETURNS int AS $f$
SELECT CASE
WHEN jsonb_typeof($1->$2)='number' THEN
CASE WHEN $3 THEN ($1->>$2)::int ELSE ($1->>$2)::float::int END
ELSE NULL::int
END;
$f$ LANGUAGE sql IMMUTABLE;
CREATE FUNCTION jbval_to_boolean(JSONB, varchar) RETURNS boolean AS $f$
SELECT CASE
WHEN jsonb_typeof($1->$2)='boolean' THEN ($1->>$2)::boolean
ELSE NULL::boolean
END;
$f$ LANGUAGE sql IMMUTABLE;