1

我想知道 select 语句中的 where 条件是否具有可为空的变量。是否必须使用 IF 条件来两次编写相同的选择语句,如下所示?有没有更好的办法?

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;
4

1 回答 1

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')才能使查询高效。

于 2012-08-16T16:29:12.997 回答