Postgresql 当我传递空输入参数时,PLPGSQL函数不返回任何结果

Postgresql 当我传递空输入参数时,PLPGSQL函数不返回任何结果,postgresql,Postgresql,我有一个函数,它使用一个输入参数对空值进行条件测试。如果输入参数不为null,则执行sql语句;如果输入参数为null,则执行最后一个sql语句 例如 当我以 选择 CAST(MD5(iml.udf\u Extract\u shipping\u HASHBYTESVALUES('SG160211304','00000','')) 我希望执行第二个查询并获得结果集。 CREATE OR REPLACE FUNCTION iml.udf_extract_shipment_hashbytesvalue

我有一个函数,它使用一个输入参数对空值进行条件测试。如果输入参数不为null,则执行sql语句;如果输入参数为null,则执行最后一个sql语句

例如

当我以
选择
CAST(MD5(iml.udf\u Extract\u shipping\u HASHBYTESVALUES('SG160211304','00000',''))

我希望执行第二个查询并获得结果集。

CREATE OR REPLACE FUNCTION iml.udf_extract_shipment_hashbytesvalues ( varchar, varchar,varchar
)
RETURNS TABLE (
  concatenatedfield text
) AS
$body$
DECLARE
    v_custpo  ALIAS FOR $1;
    v_shipqty ALIAS FOR $2;
    V_mfgpart ALIAS FOR $3;



BEGIN

    IF V_mfgpart IS NOT NULL OR V_mfgpart <> ' ' THEN

    RETURN QUERY

          SELECT 
            CAST(CASE WHEN order_no        IS NULL THEN '1' ELSE order_no        END AS VARCHAR(200)) ||
            CAST(CASE WHEN customer_po     IS NULL THEN '1' ELSE customer_po     END AS VARCHAR(200)) ||
            CAST(CASE WHEN cust_no         IS NULL THEN '1' ELSE cust_no         END AS VARCHAR(200)) ||
            CAST(CASE WHEN customer_name   IS NULL THEN '1' ELSE customer_name   END AS VARCHAR(200)) ||
            CAST(CASE WHEN vendor_no       IS NULL THEN '1' ELSE vendor_no       END AS VARCHAR(200)) ||
            CAST(CASE WHEN im_part_no      IS NULL THEN '1' ELSE im_part_no      END AS VARCHAR(200)) ||
            CAST(CASE WHEN order_branch    IS NULL THEN   1 ELSE order_branch    END AS VARCHAR(200)) ||
            CAST(CASE WHEN ship_frm_branch IS NULL THEN   1 ELSE ship_frm_branch END AS VARCHAR(200)) ||
            CAST(CASE WHEN ship_to_branch  IS NULL THEN   1 ELSE ship_to_branch  END AS VARCHAR(200)) ||
            CAST(CASE WHEN lent_order      IS NULL THEN '1' ELSE lent_order      END AS VARCHAR(200)) ||
            CAST(CASE WHEN order_type      IS NULL THEN '1' ELSE order_type      END AS VARCHAR(200)) ||
            CAST(CASE WHEN ship_qty        IS NULL THEN '1' ELSE ship_qty        END AS VARCHAR(200)) ||
            CAST(CASE WHEN inventory_type  IS NULL THEN '1' ELSE inventory_type  END AS VARCHAR(200)) ||
            CAST(CASE WHEN credit_code     IS NULL THEN '1' ELSE credit_code     END AS VARCHAR(200)) ||
            CAST(CASE WHEN tax_amt         IS NULL THEN   1 ELSE tax_amt         END AS VARCHAR(200)) ||
            CAST(CASE WHEN freight_in      IS NULL THEN '1' ELSE freight_in      END AS VARCHAR(200)) ||
            CAST(CASE WHEN freight_out     IS NULL THEN '1' ELSE freight_out     END AS VARCHAR(200)) ||
            CAST(CASE WHEN mfg_part        IS NULL THEN '1' ELSE mfg_part        END AS VARCHAR(200)) ||
            CAST(CASE WHEN description     IS NULL THEN '1' ELSE description     END AS VARCHAR(200))   
          FROM 
            iml.shipments
          WHERE customer_po = v_custpo AND ship_qty = v_shipqty  AND mfg_part = V_mfgpart;

    ELSEIF  V_mfgpart = '' OR  V_mfgpart IS NULL THEN
        RETURN QUERY
          SELECT 
            CAST(CASE WHEN order_no        IS NULL THEN '1' ELSE order_no        END AS VARCHAR(200)) ||
            CAST(CASE WHEN customer_po     IS NULL THEN '1' ELSE customer_po     END AS VARCHAR(200)) ||
            CAST(CASE WHEN cust_no         IS NULL THEN '1' ELSE cust_no         END AS VARCHAR(200)) ||
            CAST(CASE WHEN customer_name   IS NULL THEN '1' ELSE customer_name   END AS VARCHAR(200)) ||
            CAST(CASE WHEN vendor_no       IS NULL THEN '1' ELSE vendor_no       END AS VARCHAR(200)) ||
            CAST(CASE WHEN im_part_no      IS NULL THEN '1' ELSE im_part_no      END AS VARCHAR(200)) ||
            CAST(CASE WHEN order_branch    IS NULL THEN   1 ELSE order_branch    END AS VARCHAR(200)) ||
            CAST(CASE WHEN ship_frm_branch IS NULL THEN   1 ELSE ship_frm_branch END AS VARCHAR(200)) ||
            CAST(CASE WHEN ship_to_branch  IS NULL THEN   1 ELSE ship_to_branch  END AS VARCHAR(200)) ||
            CAST(CASE WHEN lent_order      IS NULL THEN '1' ELSE lent_order      END AS VARCHAR(200)) ||
            CAST(CASE WHEN order_type      IS NULL THEN '1' ELSE order_type      END AS VARCHAR(200)) ||
            CAST(CASE WHEN ship_qty        IS NULL THEN '1' ELSE ship_qty        END AS VARCHAR(200)) ||
            CAST(CASE WHEN inventory_type  IS NULL THEN '1' ELSE inventory_type  END AS VARCHAR(200)) ||
            CAST(CASE WHEN credit_code     IS NULL THEN '1' ELSE credit_code     END AS VARCHAR(200)) ||
            CAST(CASE WHEN tax_amt         IS NULL THEN   1 ELSE tax_amt         END AS VARCHAR(200)) ||
            CAST(CASE WHEN freight_in      IS NULL THEN '1' ELSE freight_in      END AS VARCHAR(200)) ||
            CAST(CASE WHEN freight_out     IS NULL THEN '1' ELSE freight_out     END AS VARCHAR(200)) ||
            CAST(CASE WHEN mfg_part        IS NULL THEN '1' ELSE mfg_part        END AS VARCHAR(200)) ||
            CAST(CASE WHEN description     IS NULL THEN '1' ELSE description     END AS VARCHAR(200))   
          FROM 
            iml.shipments
          WHERE customer_po = v_custpo AND ship_qty = v_shipqty  AND mfg_part IS NULL OR mfg_part = V_mfgpart
          ;

END IF;

END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100 ROWS 1000;
创建或替换函数iml.udf\u extract\u shipping\u hashbytesvalues(varchar,varchar,varchar
)
返回表(
连接字段文本
)作为
$body$
声明
v_custpo别名为1美元;
v_shipqty别名为$2;
V_mfgpart别名3美元;
开始
如果V_mfgpart不是NULL或V_mfgpart“”,则
返回查询
挑选
强制转换(如果订单号为空,则为“1”,否则订单号以VARCHAR(200)结尾)||
强制转换(当customer_po为空时,则为“1”,否则customer_po以VARCHAR(200)结束)||
强制转换(当cust_no为NULL时,则为“1”,否则cust_no以VARCHAR(200)结尾)||
强制转换(当customer_name为NULL时为'1',否则customer_name以VARCHAR(200)结尾)||
强制转换(当供应商编号为空时,则为“1”,否则供应商编号以VARCHAR(200)结尾)||
强制转换(如果im_part_no为NULL,则为'1',否则im_part_no以VARCHAR(200)结尾)||
强制转换(当order_分支为NULL时,则1个ELSE order_分支结束为VARCHAR(200))||
强制转换(当ship_frm_分支为NULL时,则1个其他ship_frm_分支结束为VARCHAR(200))||
强制转换(当ship_to_分支为NULL时,则1个其他ship_to_分支以VARCHAR(200)结尾)||
强制转换(如果lent_顺序为空,则为“1”,否则lent_顺序以VARCHAR(200)结尾)||
强制转换(当order_type为NULL时,则为“1”,否则order_type以VARCHAR(200)结尾)||
强制转换(如果发货数量为空,则为“1”,否则发货数量以VARCHAR(200)结束)||
强制转换(如果库存类型为空,则为“1”,否则库存类型结束为VARCHAR(200))||
强制转换(当信用证代码为空时,则为“1”,否则信用证代码以VARCHAR(200)结尾)||
强制转换(当税金额为空时,则1个其他税金额以VARCHAR(200)结尾)||
强制转换(当运费为空时,则为“1”,否则运费为VARCHAR(200))||
强制转换(当运费输出为空时,则为“1”,否则运费输出以VARCHAR(200)结束)||
强制转换(如果制造零件为空,则为“1”,否则制造零件以VARCHAR(200)结束)||
强制转换(如果描述为NULL,则为“1”,否则描述将以VARCHAR(200)结尾)
从…起
国际海运
其中,客户订单=客户订单,发货数量=发货数量,制造零件=发货零件;
否则,如果V_mfgpart=''或V_mfgpart为空,则
返回查询
挑选
强制转换(如果订单号为空,则为“1”,否则订单号以VARCHAR(200)结尾)||
强制转换(当customer_po为空时,则为“1”,否则customer_po以VARCHAR(200)结束)||
强制转换(当cust_no为NULL时,则为“1”,否则cust_no以VARCHAR(200)结尾)||
强制转换(当customer_name为NULL时为'1',否则customer_name以VARCHAR(200)结尾)||
强制转换(当供应商编号为空时,则为“1”,否则供应商编号以VARCHAR(200)结尾)||
强制转换(如果im_part_no为NULL,则为'1',否则im_part_no以VARCHAR(200)结尾)||
强制转换(当order_分支为NULL时,则1个ELSE order_分支结束为VARCHAR(200))||
强制转换(当ship_frm_分支为NULL时,则1个其他ship_frm_分支结束为VARCHAR(200))||
强制转换(当ship_to_分支为NULL时,则1个其他ship_to_分支以VARCHAR(200)结尾)||
强制转换(如果lent_顺序为空,则为“1”,否则lent_顺序以VARCHAR(200)结尾)||
强制转换(当order_type为NULL时,则为“1”,否则order_type以VARCHAR(200)结尾)||
强制转换(如果发货数量为空,则为“1”,否则发货数量以VARCHAR(200)结束)||
强制转换(如果库存类型为空,则为“1”,否则库存类型结束为VARCHAR(200))||
强制转换(当信用证代码为空时,则为“1”,否则信用证代码以VARCHAR(200)结尾)||
强制转换(当税金额为空时,则1个其他税金额以VARCHAR(200)结尾)||
强制转换(当运费为空时,则为“1”,否则运费为VARCHAR(200))||
强制转换(当运费输出为空时,则为“1”,否则运费输出以VARCHAR(200)结束)||
强制转换(如果制造零件为空,则为“1”,否则制造零件以VARCHAR(200)结束)||
强制转换(如果描述为NULL,则为“1”,否则描述将以VARCHAR(200)结尾)
从…起
国际海运
其中customer_po=v_custpo和ship_qty=v_shipqty和mfg_part为空或mfg_part=v_mfgpart
;
如果结束;
结束;
$body$
语言“plpgsql”
不稳定的
调用空输入
安全调用程序
成本100行1000;

您正在将一个不为null的空字符串作为mfgpart传递。因此将执行第一个查询。仅当您将null作为mfgpart传递时,才会执行第二个查询。如果希望在传递空字符串时执行第二个查询,请更改

IF V_mfgpart IS NOT NULL OR V_mfgpart <> ' ' THEN

顺便说一句,最好使用
COALESCE(order\u no,'1')
而不是
CASE,当order\u no为空时,则使用'1'否则,order\u no END
这就是我想要的;它很有效。非常感谢。
IF V_mfgpart IS NOT NULL and V_mfgpart <> '' THEN
create or replace function iml.udf_extract_shipment_hashbytesvalues (
    varchar v_custpo,
    varchar v_shipqty,
    varchar v_mfgpart
)
returns table (
  concatenatedfield text
) as
$body$
    select 
        cast(case when order_no        is null then '1' else order_no        end as varchar(200)) ||
        cast(case when customer_po     is null then '1' else customer_po     end as varchar(200)) ||
        cast(case when cust_no         is null then '1' else cust_no         end as varchar(200)) ||
        cast(case when customer_name   is null then '1' else customer_name   end as varchar(200)) ||
        cast(case when vendor_no       is null then '1' else vendor_no       end as varchar(200)) ||
        cast(case when im_part_no      is null then '1' else im_part_no      end as varchar(200)) ||
        cast(case when order_branch    is null then   1 else order_branch    end as varchar(200)) ||
        cast(case when ship_frm_branch is null then   1 else ship_frm_branch end as varchar(200)) ||
        cast(case when ship_to_branch  is null then   1 else ship_to_branch  end as varchar(200)) ||
        cast(case when lent_order      is null then '1' else lent_order      end as varchar(200)) ||
        cast(case when order_type      is null then '1' else order_type      end as varchar(200)) ||
        cast(case when ship_qty        is null then '1' else ship_qty        end as varchar(200)) ||
        cast(case when inventory_type  is null then '1' else inventory_type  end as varchar(200)) ||
        cast(case when credit_code     is null then '1' else credit_code     end as varchar(200)) ||
        cast(case when tax_amt         is null then   1 else tax_amt         end as varchar(200)) ||
        cast(case when freight_in      is null then '1' else freight_in      end as varchar(200)) ||
        cast(case when freight_out     is null then '1' else freight_out     end as varchar(200)) ||
        cast(case when mfg_part        is null then '1' else mfg_part        end as varchar(200)) ||
        cast(case when description     is null then '1' else description     end as varchar(200))   
    from 
        iml.shipments
    where
        customer_po = v_custpo and
        ship_qty = v_shipqty and
        (v_mfg_part is null or v_mfg_part = '' or mfg_part = v_mfgpart)
    ;
end;
$body$
language sql
volatile
called on null input
security invoker
cost 100 rows 1000;