1

假设我有下表:

CREATE TABLE numbers
(
  key integer NOT NULL DEFAULT 0,
  number1 integer NOT NULL DEFAULT 0,
  number2 integer NOT NULL DEFAULT 0,
  number3 integer NOT NULL DEFAULT 0,
  number4 integer NOT NULL DEFAULT 0,

  CONSTRAINT pk PRIMARY KEY (key),
  CONSTRAINT nonzero CHECK (key <> 0)
)

我要检索的是所有 4 个数字的给定键的最小值,但忽略那些为零的值。

当我认为我会遇到零问题时,我从这样的事情开始:

SELECT LEAST(number1, number2, number3, number4) FROM numbers WHERE key = 1

例如,如果我有我想要返回的元组(1, 5, 0, 3, 2)2或者(2, 3, 0, 0, 0)我想要返回3等等。

这可以在单个查询中完成(或者可能是嵌套的),我真的不想编写一个过程来做到这一点。

4

2 回答 2

4

尝试 NULLIF 函数:

SELECT LEAST(
        nullif( number1, 0 ), 
        nullif( number2, 0 ), 
        nullif( number3, 0 ), 
        nullif( number4, 0 )) 
FROM numbers

演示 --> http://www.sqlfiddle.com/#!12/641fb3/1

于 2013-10-09T21:41:49.797 回答
0

LEAST将忽略NULL值,因此以下应该有效:

select least(n1, n2, n3, n4)
from (
   select case when number1 <= 0 then null else number1 end as n1,
          case when number2 <= 0 then null else number2 end as n2,
          ...
    from numbers
) t

这样你也可以处理负数。如果您确定永远不会有负值,那么 kordirko 的答案可能会更容易一些。

于 2013-10-09T21:42:06.653 回答