我使用此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>
如何解决?
答案 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;