I have a function that has a condition testing for null values with one of the input parameters. If the input parameter is not null, it executes the sql statment, if its null then fit executes the last SQL statment.
For example
When I execute the function as
SELECT
CAST(MD5(iml.udf_Extract_Shipment_HASHBYTESVALUES('SG160211304', '+00000', ''))
I expected the second query to be executed and get a result set.
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')instead ofCASE WHEN order_no IS NULL THEN '1' ELSE order_no END