【问题标题】:Extracting key from json string having null value从具有空值的json字符串中提取键
【发布时间】:2021-02-16 19:55:32
【问题描述】:

我有以下功能

CREATE OR REPLACE FUNCTION public."test"(
    _data text)
    RETURNS integer
    LANGUAGE 'plpgsql'

    COST 100
    VOLATILE 
    
AS $BODY$
    
    declare _sdate date:= null;
    
    begin
        
        select json_extract_path(_data:: json , 'sdate') into _sdate;
        select _data:: json -> 'sdate' into _sdate;
    END;
$BODY$;

我尝试了两种方式,但是当 sdate 为 null 时会引发语法错误

我在打电话

select public."test"($${
        "sdate":null
      }$$)

但是当我给出 sdate 值时它正在工作

select public."test"($${
        "sdate":"2020-1-01"
      }$$)

我也尝试过类似的显式解析

select _data:: json -> 'sdate'::date into _sdate;

但不工作

【问题讨论】:

    标签: json postgresql plpgsql


    【解决方案1】:

    你的函数中有很多错误。第一个是您没有返回任何内容,因为您缺少 return 语句。

    您的表达式:_data:: json -> 'sdate'::date 不起作用,因为转换运算符 :: 的绑定比 ->' operator and thus you are casting 'sdate'to a date, not the result of the->` 运算符更强。

    您还应该将函数参数声明为json,而不是将其强制转换到函数内部。并且您需要使用->> 将值作为文本值返回,因为没有从json 直接转换为date

    您将结果转换为日期,但您的函数被声明为返回 integer,这也不匹配。

    CREATE OR REPLACE FUNCTION public."test"(_data json)
      RETURNS date --<< here
      LANGUAGE plpgsql
      stable
    AS 
    $BODY$
    declare 
      _sdate date := null;
    begin
      _sdate := (_data ->> 'sdate')::date;
      return _sdate;
    END;
    $BODY$;
    

    您格式化代码的方式表明您认为每个变量都需要declare。但是declare 启动了一个可以包含多个声明的块。声明,不需要为每个变量重复。

    【讨论】:

    • 我已经给出了唯一不起作用的部分......在准备时可能会出现一些错字,但我面临的实际问题是当我在 json 中的日期键中传递 null 时它会引发错误但当我传递它的工作价值时
    • 我收到错误,类型 date:"null" 的输入语法无效,而这正是在这里 "select _data::json -> 'sdate' into _sdate"
    • 好吧,如果你只展示问题的一部分,你希望如何得到真正问题的答案?我的函数在输入 NULL 时没有问题:dbfiddle.uk/…
    • 感谢您在小提琴的帮助下,我发现我的功能正常工作....只是想知道您是否可以提供帮助...差异是我使用的是 -> 而不是 ->> 和: :date 转换最后不使用 ->
    • 我在回答的第二段和第三段中已经解释过了
    猜你喜欢
    • 1970-01-01
    • 2015-11-09
    • 2014-04-03
    • 1970-01-01
    • 2016-05-27
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多