2012-04-18 167 views
1

我正在使用DB2 v9DB2条件WHERE子句

我有一个带有参数的存储过程,可能会以空字符串的形式传入。这里somer伪代码为我想要做的:

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

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

回答

5
SELECT ... 
FROM ... 
WHERE param1 = '' 
    OR myColumn.name = param1 
    ; 
+1

你的智慧超出了我最疯狂的梦想。谢谢! – Ted 2012-04-18 17:45:36

+0

这个想法是,通常*查询生成器/优化器足够智能以检测“循环不变”条件。 (就像'WHERE 1 = 0 OR ...') – wildplasser 2012-04-18 17:54:24

+1

@Ted - 请注意,虽然我做了类似的事情,但SQL并不能像大多数编程语言那样确保“短路”顺序。 wildplasser的评论(通常)是实际发生的事情,这可能会使它出现这种行为。 – 2012-04-19 16:28:47

1

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

首先,存储过程输入参数可能包含NULL而不是“'。使用COALESCENULLIF功能将涵盖空和空空间的任何金额:

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

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

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

此处的另一个关键词将是“Dynamic SQL”。建立你的查询作为一个字符串,或EXECUTE IMMEDIATE他们(对于UPDATE,INSERT或DDL's)或使用PREPARE/OPEN/FETCH(对于SELECT)。