JSONB对象字段为数字或布尔值(不需要文本转换)

时间:2016-01-03 18:03:23

标签: postgresql jsonb

现在使用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;

0 个答案:

没有答案