我有一個函數,它有一個條件測試其中一個輸入參數的空值。如果輸入參數不爲空,它將執行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' –