DB2条件WHERE子句(DB2 Conditional WHERE clause)

2019-09-16 15:07发布

我使用的是DB2 V9

我有可能潜在地作为空字符串传递PARAMATERS的存储过程。 这里森玛什么,我试图做的伪代码:

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

基本上忽略帕拉姆如果它是一个空字符串。 如果没有,申请它作为在WHERE子句中的过滤器。 这是可能的DB2做什么?

Answer 1:

SELECT ...
FROM ...
WHERE  param1 = '' 
   OR  myColumn.name = param1
   ;


Answer 2:

该答案提供wildplasser是正确的,但也有一些额外的考虑,可能有助于包括。

首先,有可能是存储过程的输入参数包含一个NULL,而不是'。 使用COALESCE或NULLIF函数包括一个NULL和的空的空间的任何量:

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

当这种类型的搜索查询被编译成一个存储过程,它通常有助于在程序中的语句始终启用REOPT。 如果你不这样做,你的存储过程中的SQL语句将始终使用相同的访问计划,不管是哪个输入参数传递到运行时的存储过程。 允许在运行时的程序优化,以重新评估每一个语句将提供利用的右手食指的一个更好的机会,当特定的栏用户搜索。

CALL SYSPROC.REBIND_ROUTINE_PACKAGE 
    ('P','YOURPROCSCHEMA.YOURPROCNAME','REOPT ALWAYS') ; 


Answer 3:

这里的另一个关键词是“ 动态SQL ”。 建立你的查询作为一个字符串,要么EXECUTE IMMEDIATE它们(UPDATE,INSERT或DDL的),或使用PREPARE / OPEN / FETCH (用于SELECT的)。



文章来源: DB2 Conditional WHERE clause
标签: sql db2