2014-03-13 121 views
0

我有一个函数,它有一个条件测试其中一个输入参数的空值。如果输入参数不为空,它将执行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; 
+0

顺便说一句,最好使用'COALESCE(order_no,'1')'而不是'CASE WHEN'order_no IS NULL THEN'1'else else order_no END' –

回答

1

你传递一个空字符串,它不为空,因为mfgpart。所以第一个查询将被执行。如果您将mfgpart作为null传递,则只会执行第二个查询。如果你想,当你通过,则一个空字符串改变

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

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

通知的空间VS空字符串

要执行的第二个查询我怀疑你想要这个

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; 
+0

这就是我想要的;有效。非常感谢。 – user3416060

相关问题