从具有空值的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”好吧,如果您只显示部分问题,你期望如何得到你真正问题的答案?我的函数在使用空输入时不会出现问题:谢谢你的帮助,我发现我的函数正在工作。。。。只是想知道你是否能帮上忙。。。区别在于我在最后使用了->而不是->>和::日期转换而不是->我在回答的第二段和第三段中解释了这一点