我有一个函数,它有一个条件测试其中一个输入参数的空值。如果输入参数不为空,它将执行sql语句,如果它的null和fit会执行最后的SQL语句。当我通过一个空输入参数时,PLPGSQL函数不返回结果
例如
当我执行如
SELECT CAST(MD5(iml.udf_Extract_Shipment_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;
顺便说一句,最好使用'COALESCE(order_no,'1')'而不是'CASE WHEN'order_no IS NULL THEN'1'else else order_no END' –