2012-08-16 35 views
1

我在想如果select语句中的where条件是否有可为空的变量。它是否必须使用IF条件像下面那样两次编写相同的select语句?有没有更好的办法?PL/SQL选择条件有一个可为空的变量

FUNCTION function1(
    foo IN INTEGER, 
) RETURN INTEGER 
    ret  INTEGER; 
    BEGIN 

IF foo IS NULL THEN 
    SELECT COUNT(*) INTO ret FROM t WHERE t.col IS NULL; 
ELSE 
    SELECT COUNT(*) INTO ret FROM t WHERE t.col = foo; 
END IF; 
RETURN ret; 

END function1; 

回答

2

你总是可以做

SELECT COUNT(*) 
    INTO ret 
    FROM t 
WHERE (t.col IS NULL AND foo IS NULL) 
    OR t.col = foo; 

这可以简化为

SELECT COUNT(*) 
    INTO ret 
    FROM t 
WHERE NVL(t.col, 'Some Impossible Value') = NVL(foo, 'Some Impossible Value'); 

虽然你可能需要在一个NVL(t.col, 'Some Impossible Value')基于函数的索引,使查询高性能。