我正在使用 DB2 v9
我有一个存储过程,其参数可能会作为空字符串传入。这是我想做的一些伪代码:
WHERE myColumn.name =
IF param1 = '' THEN
**disregard this param, all column values are eligible**
ELSE
myColumn.name = param1;
如果参数是空字符串,则基本上忽略该参数。如果没有,请将其用作 WHERE 子句中的过滤器。这可以在 DB2 中实现吗?
SELECT ...
FROM ...
WHERE param1 = ''
OR myColumn.name = param1
;
由 wildplasser 提供的 answer 是正确的,但还有一些其他注意事项可能有助于包含在内。
首先,存储过程输入参数可能包含 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') ;
这里的另一个关键字是“动态 SQL”。将查询构建为字符串,然后使用
EXECUTE IMMEDIATE
(对于 UPDATE、INSERT 或 DDL)或使用 PREPARE
/OPEN
/FETCH
(对于 SELECT)。
你需要这个:
...
AND (NULLIF('${param}', '') IS NULL OR column LIKE '${param}')
...
如果参数为空,这将作为“AND TRUE”工作,并将停止对 OR 条件右侧部分的评估