Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php pgsql-如何仅获取存储过程中not null值的总和_Php_Mysql_Postgresql_Stored Procedures - Fatal编程技术网

Php pgsql-如何仅获取存储过程中not null值的总和

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

我已经在pgsql中创建了一个存储过程。特定列中有一个json对象,我需要获取该json对象中的数据总和。它可以完美地工作,直到遇到空值为止。 json对象中的元素可以有空值。但是当我得到总数时,它给出了一个错误

语句无法执行22P02-7-错误:整数的输入语法无效:上下文:PL/pgSQL函数gettargetreportsdate,返回查询时的日期行3

这是我的存储过程。我怎样才能绕过这个问题

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