2013-10-09 40 views
0

比方說,我有如下表:獲取的多個列的最小非零值

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等。

這可以在一個單一的查詢(或可能嵌套)完成,我真的不想寫一個過程來做到這一點。

+0

我不明白,你說你想要最小的非零值,但是在你的兩個例子中,你似乎與此矛盾。 – Eluvatar

+0

@Eluvatar:第一個數字是他例子中的'鍵'。 –

回答

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的答案可能會更容易一些。

+0

是的,謝謝你,在現實生活中,他們的日期如此,沒有負值 – BrunoJ

+0

@BrunoJ:我很困惑,'0'是一個無效的日期值。 –

+0

它們實際上是日期和日期類型,我們使用'0100-01-01'作爲「零」日期 – BrunoJ