从具有空值的json字符串中提取密钥

从具有空值的json字符串中提取密钥,json,postgresql,plpgsql,Json,Postgresql,Plpgsql,我有以下功能 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_

我有以下功能

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;

但是不工作

您的函数中有许多错误。第一种情况是,由于缺少
return
语句,所以没有返回任何内容

您的表达式:
\u data::json->'sdate':date
不起作用,因为强制转换运算符
->'运算符绑定得更紧密,因此您将
'sdate'
强制转换为日期,而不是
->'运算符的结果

您还应该将函数参数声明为
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$;
创建或替换函数public.“test”(_datajson)
返回日期-->'sdate')::日期;
返回日期;
结束;
$BODY$;


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

我给出了唯一一个不起作用的部分。。。在准备时可能会有一些输入错误,但我面临的实际问题是,当我在json中的日期键中传递null时,它会抛出错误,但当我传递它工作的值时,我会得到错误,类型date的输入语法无效:“null”,这正是这里的“select _data::json->‘sdate’into _sdate”好吧,如果您只显示部分问题,你期望如何得到你真正问题的答案?我的函数在使用空输入时不会出现问题:谢谢你的帮助,我发现我的函数正在工作。。。。只是想知道你是否能帮上忙。。。区别在于我在最后使用了->而不是->>和::日期转换而不是->我在回答的第二段和第三段中解释了这一点