PostgreSQL如果字段为null,则整个sql为null

时间:2018-08-14 12:00:14

标签: postgresql

我使用此sql执行sql:

    v_sql4 :='
    INSERT INTO public.rebatesys(head,contract_no,history_no,f_sin,line_no,s_line_no,departmentcd,catagorycd,jan,seriescd,f_exclude,     f_del,ins_date,ins_time,ins_user_id,ins_func_id,ins_ope_id,upd_date,upd_time,upd_user_id,upd_func_id,upd_ope_id)                                   
     VALUES (0, '''||v_contract_no||''', '||v_history_no||',1, '||v_line_no||', '||v_down_s_line_no||', '||coalesce(v_deptCD,null)||', '||0||', '''||v_singleJan||''','''||0||''','||v_fExclude||',
    0, current_date, current_time, '||v_ins_user_id||', 0, 0,
    current_date,current_time,'||v_upd_user_id||',0, 0);';
RAISE NOTICE 'v_sql4 IS : %', v_sql4;
    EXECUTE v_sql4;

但是当字段“ v_deptCD”为空时,整个sql为空,即使我使用coalesce,我仍然不能执行id,输出是:

NOTICE:  v_sql4 IS : <NULL>

如何解决?

3 个答案:

答案 0 :(得分:1)

v_deptCD为空时,您要用字符串 'null'而不是关键字

', '||coalesce(v_deptCD,'null')||', '

答案 1 :(得分:0)

您可以使用此

kill -9 3139

或将其用于sql内部的字符串合并

Taskkill /PID 3139 /F

答案 2 :(得分:0)

JGH解决方案的替代方法是使用函数format(your_string, list, of, values),它可以忽略NULL值,但是如果在格式字符串中使用NULL,则可以选择将它们显示为%L。但是,如果使用该格式说明符,它将使用单引号引起来,在某些情况下需要强制转换。

  

根据格式字符串设置参数格式。此函数类似于C函数sprintf。参见Section 9.4.1

但是我认为最好的解决方案是使用USING子句并在其中传递值。它看起来有点像预备语句,可以保护您免受SQL注入的侵扰,但不会像预备语句那样缓存计划。 executing dynamic commands的文档中提供了有关如何执行此操作的简单示例。

EXECUTE 'SELECT count(*) FROM mytable WHERE inserted_by = $1 AND inserted <= $2'
   INTO c
   USING checked_user, checked_date;