我正在使用DB2 v9
我有一个带有参数的存储过程,它可能作为空字符串传入。这里有一些伪代码用于我正在尝试做的事情:
WHERE myColumn.name =
IF param1 = '' THEN
**disregard this param, all column values are eligible**
ELSE
myColumn.name = param1;
如果它是一个空字符串,基本上只是忽略它。如果不是,请将其作为WHERE子句中的过滤器应用。这可以在DB2中做吗?
答案 0 :(得分:5)
SELECT ...
FROM ...
WHERE param1 = ''
OR myColumn.name = param1
;
答案 1 :(得分:1)
answer提供的wildplasser是正确的,但还有一些其他注意事项可能会有所帮助。
首先,存储过程输入参数可能包含NULL而不是''。使用COALESCE或NULLIF函数将涵盖NULL和任意数量的空白空间:
SELECT ... FROM ... WHERE COALESCE( param1, '' ) = '' OR myColumn.name = param1 ;
当将这种类型的搜索查询编译到存储过程中时,通常有助于在过程内的语句上启用REOPT ALWAYS。如果不这样做,则无论在运行时将哪些输入参数传递到存储过程,存储过程中的SQL语句将始终使用相同的访问计划。允许优化器在运行时重新评估过程中的每个语句将提供在用户搜索特定列时利用正确索引的更好机会。
CALL SYSPROC.REBIND_ROUTINE_PACKAGE
('P','YOURPROCSCHEMA.YOURPROCNAME','REOPT ALWAYS') ;
答案 2 :(得分:0)
此处的另一个关键字是“Dynamic SQL”。将您的查询构建为字符串,并EXECUTE IMMEDIATE
(对于UPDATE,INSERT或DDL)或使用PREPARE
/ OPEN
/ FETCH
(对于SELECT)。