Php pgsql-如何仅获取存储过程中not null值的总和
我已经在pgsql中创建了一个存储过程。特定列中有一个json对象,我需要获取该json对象中的数据总和。它可以完美地工作,直到遇到空值为止。 json对象中的元素可以有空值。但是当我得到总数时,它给出了一个错误 语句无法执行22P02-7-错误:整数的输入语法无效:上下文:PL/pgSQL函数gettargetreportsdate,返回查询时的日期行3 这是我的存储过程。我怎样才能绕过这个问题Php pgsql-如何仅获取存储过程中not null值的总和,php,mysql,postgresql,stored-procedures,Php,Mysql,Postgresql,Stored Procedures,我已经在pgsql中创建了一个存储过程。特定列中有一个json对象,我需要获取该json对象中的数据总和。它可以完美地工作,直到遇到空值为止。 json对象中的元素可以有空值。但是当我得到总数时,它给出了一个错误 语句无法执行22P02-7-错误:整数的输入语法无效:上下文:PL/pgSQL函数gettargetreportsdate,返回查询时的日期行3 这是我的存储过程。我怎样才能绕过这个问题 CREATE OR REPLACE FUNCTION public.gettargetreport
CREATE OR REPLACE FUNCTION public.gettargetreports(
IN start_dates date,
IN end_dates date)
RETURNS TABLE(report_id integer, report_name text, profileid text,
conv integer, visits integer, avgtime integer, revenue integer,
backlink integer, newvisits integer, bouncerate integer, roomnights
integer, visibility integer, marketshare integer, pagesvisits integer,
transactions integer, domainauthority integer, seocontribution
integer, overallwebvisits integer, newvisitspercentage integer) AS
$BODY$
BEGIN
RETURN QUERY (
(SELECT
rpt.report_id,
rpt.report_name,
rpt.report_data->>'profile' as profileId,
sum((rpt.report_target_data->>'conv')::int)::int as conv,
sum((rpt.report_target_data->>'visits')::int)::int as visits,
sum((rpt.report_target_data->>'avgTime')::int)::int as avgTime,
sum((rpt.report_target_data->>'revenue')::int)::int as revenue,
sum((rpt.report_target_data->>'backlink')::int)::int as backlink,
sum((rpt.report_target_data->>'newVisits')::int)::int as newVisits,
sum((rpt.report_target_data->>'bounceRate')::int)::int as bounceRate,
sum((rpt.report_target_data->>'roomNights')::int)::int as roomNights,
sum((rpt.report_target_data->>'visibility')::int)::int as visibility,
sum((rpt.report_target_data->>'marketshare')::int)::int as marketshare,
sum((rpt.report_target_data->>'pagesVisits')::int)::int as pagesVisits,
sum((rpt.report_target_data->>'transactions')::int)::int as transactions,
sum((rpt.report_target_data->>'domainAuthority')::int)::int as domainAuthority,
sum((rpt.report_target_data->>'seoContribution')::int)::int as seoContribution,
sum((rpt.report_target_data->>'overallWebVisits')::int)::int as overallWebVisits,
sum((rpt.report_target_data->>'newVisitsPercentage')::int)::int as newVisitsPercentage
FROM public.proc_targetreport as rpt
WHERE (
rpt.start_date >= (date_trunc('MONTH', start_dates))::date AND
rpt.end_date <= (date_trunc('MONTH', end_dates))::date
)
GROUP BY rpt.report_id,rpt.report_name,profileId
)
);
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100
ROWS 1000;
report_target_data是json objects列名您可以尝试monkey hack,只有当您有正常的数值或空字符串时,它才会起作用,例如:
t=# select (concat('0',('{"s":null}'::json->>'s')))::int;
concat
--------
0
(1 row)
t=# select (concat('0',('{"s":""}'::json->>'s')))::int;
concat
--------
0
(1 row)
t=# select (concat('0',('{"s":29}'::json->>'s')))::int;
concat
--------
29
(1 row)
您可以尝试monkey hack,只有当您有正常的数值或空字符串时,它才会起作用,例如:
t=# select (concat('0',('{"s":null}'::json->>'s')))::int;
concat
--------
0
(1 row)
t=# select (concat('0',('{"s":""}'::json->>'s')))::int;
concat
--------
0
(1 row)
t=# select (concat('0',('{"s":29}'::json->>'s')))::int;
concat
--------
29
(1 row)
JSON null应转换为SQL null。您可以将SQL null强制转换为int:
select ('{"s":null}'::json->>'s')::int;
-->
NULL
但可能您使用的不是null,而是空字符串或null字符串。在这种情况下,您可以使用case来翻译:
select case when col1 = 'xxx' then null else col1 end::int
from (
select '{"s":"xxx"}'::json->>'s' as col1
) sub1;
-->
NULL
JSON null应转换为SQL null。您可以将SQL null强制转换为int:
select ('{"s":null}'::json->>'s')::int;
-->
NULL
但可能您使用的不是null,而是空字符串或null字符串。在这种情况下,您可以使用case来翻译:
select case when col1 = 'xxx' then null else col1 end::int
from (
select '{"s":"xxx"}'::json->>'s' as col1
) sub1;
-->
NULL
我宁愿说空值,而不是null我宁愿说空值,而不是null实际上->>将JSON null转换为SQL null。例如:选择“{s:null}”::json->'s'::int;也许OP有空值?实际上->>将JSON空值转换为SQL空值。例如:选择“{s:null}”::json->'s'::int;可能OP有空值?sumrpt.report_target_data::json->“conv”::int::int as conv is this corrector看起来不错,整数和也是整数,因此不需要外部::int sumrpt.report_target_data::json->“conv”::int::int as conv is this corrector看起来不错,整数和也是整数,因此不需要外部::int