2

我正在使用 DB2 v9

我有一个带有参数的存储过程,这些参数可能会作为空字符串传入。这是我正在尝试做的一些伪代码:

WHERE myColumn.name =
     IF param1 = '' THEN
        **disregard this param, all column values are eligible**
     ELSE
        myColumn.name = param1;

如果它是一个空字符串,基本上只是忽略参数。如果没有,请将其作为 WHERE 子句中的过滤器应用。这可以在 DB2 中实现吗?

4

3 回答 3

5
SELECT ...
FROM ...
WHERE  param1 = '' 
   OR  myColumn.name = param1
   ;
于 2012-04-18T17:08:10.953 回答
1

wildplasser提供的答案正确的,但还有一些额外的考虑因素可能有助于包括在内。

首先,存储过程输入参数可能包含 NULL 而不是 ''。使用COALESCENULLIF函数将覆盖 NULL 和任意数量的空白空间:

SELECT ... FROM ... WHERE COALESCE( param1, '' ) = '' OR myColumn.name = param1 ;

当该类型的搜索查询编译到存储过程中时,通常有助于在过程中的语句上启用 REOPT ALWAYS。如果您不这样做,则存储过程中的 SQL 语句将始终使用相同的访问计划,而不管在运行时将哪些输入参数传递给存储过程。当用户在特定列上搜索时,允许优化器在运行时重新评估过程中的每个语句将提供更好的利用正确索引的机会。

CALL SYSPROC.REBIND_ROUTINE_PACKAGE 
    ('P','YOURPROCSCHEMA.YOURPROCNAME','REOPT ALWAYS') ; 
于 2012-04-18T22:28:41.653 回答
0

这里的另一个关键字是“动态 SQL ”。将您的查询构建为字符串,或者使用EXECUTE IMMEDIATE它们(对于 UPDATE、INSERT 或 DDL)或使用PREPARE/ OPEN/ FETCH(对于 SELECT)。

于 2012-04-20T21:10:04.820 回答