如何从 postgresql 中的 json 输入中提取值?

How to extract the values from json input in postgresql?

我正在使用 PostgreSQL 存储函数,我需要从 JSON 输入中提取值并与 table 和 return 中的列匹配 table JSON 格式。 我的 JSON 输入,

{
"sensor":"sensor1",
"fromdate":date,
"todate":"date
}

my sensortable 这是我到目前为止工作的功能

select array_to_json(array_agg(row_to_json(d)))
      from (
        select sensor,id,value,created_date
        from probe_data
        where  probe_data.sensor =sensors
         AND probe_data.created_date >=fromdate AND  probe_data.created_date <= todate
      ) d
select x.sensores,x.fromdate,x.todate from json_to_recordset() x
(
sensors text,
fromdate timestamp,
todate timestamp)

如您所见,我可以从 JSON 输入中获取数据,但我不知道如何在 WHERE 条件下访问它。我需要一些帮助才能做到这一点。

您可以简单地使用 JSONB 运算符来实现,如下所示:

试试这个:

create or replace function example (param1 jsonb) 
returns table (sensor_ varchar, id_ int, value_ numeric, created_date_ TIMESTAMP) 
as 
$body$
    begin
    RETURN query
    select sensor, id, value, created_date from probe_data 
    where 
    created_date >=(param1->>'fromdate')::TIMESTAMP 
    and 
    created_date <= (param1->>'todate')::TIMESTAMP;

    end;

$body$ 

LANGUAGE plpgsql;

如果你想要上面的输出 JSON ARRAY 格式那么

试试这个:

create or replace function example1 (param1 jsonb) 
returns jsonb 
as 
$body$
declare 
    jsondata jsonb;

begin
    
    jsondata = (select 
            array_to_json(array_agg(row_to_json(d))) from (
            select sensor, id, value, created_date from probe_data 
            where 
            created_date >=(param1->>'fromdate')::TIMESTAMP 
            and 
            created_date <= (param1->>'todate')::TIMESTAMP ) d);
RETURN jsondata;
end;
$body$
LANGUAGE plpgsql;

FIDDLE