2014-01-23 3 views
7

최소한의 값을 찾기 위해 프로 시저에서 LEAST 함수를 사용하고 싶습니다. 문제는 내가최소값을 찾지 만 Oracle SQL에서는 NULL이 아닙니다.

select least(NULL,0,1) from dual 

을 할 경우 내가 할 대답은 NULL 그래서 일부 값은 내가 반환을 기대하고있는 것이 아닙니다에 의해 아마 올바른 인 NULL을되었을 수도 있다는 것입니다. 나는 최소한의 0이 아닌 값을 얻고 싶다. 어떤 도움이라도 대단히 감사합니다.

답변

1

나는 이것이 실제로 귀하의 질문에 의문을 제기합니다. 어쩌면 너 더 많은 것을하고있는거야? 그렇다면

select least(some_column) from dual 

이로 변경 : 방금 세트를 필터링 할 where을 사용할 수 없습니다 더 이런 일을하고 있다면,

select least(some_column) from dual where some_column is not null 

를 또는,

select least(expr1,expr2,expr3) from dual 

이 작업을 수행 :

select least(coalesce(expr1, 12345), coalesce(expr2, 12345), coalesce(expr3, 12345)) from dual 

여기서 12345은 다른 모든 표현식이 NULL 인 경우에만 선택되는 값입니다.

+0

감사 @tenfour을, 나는 NULL을했을 것이다 일부는 여러 결과를 비교했다. 병합하여 내 문제를 해결했습니다. –

+1

LEAST는 적어도 2 개의 매개 변수로 항상 호출되어야합니다. 그렇지 않으면 쓸모가 없습니다. 초기 예제는 초보자에게 혼동을 줄 수 있습니다. 또한, 모든 인수가 NULL이면 NULL 대신에'12345' (또는 당신이 사용하는 임의의 큰 숫자)를 반환하는 것은 기다리고있는 버그입니다, IMHO. –

+0

동의합니다. 실제로 당신이 세트에 대해 이런 종류의 제어를 원한다면 아마도 서브 쿼리를 인수 분해하여 사용하는 것이 좋을 것입니다. 그러면 논리가 훨씬 더 정상적으로됩니다. – tenfour

8

인수가 NULL이면 다른 인수 중 최소의 것을 취하려고합니다. 모든 인수가 NULL이면 NULL을 리턴하려고합니다.

나는 두 개의 인수를 위해 이런 일을 사용할 수 있습니다 :

LEAST(NVL(colA,colB), NVL(colB,colA)) 

그것은 비록>이 개 인수 추악한 얻기 시작 :

LEAST(COALESCE(colA,colB,colC) 
    ,COALESCE(colB,colA,colC) 
    ,COALESCE(colC,colA,colB)) 

하는 시점에서 마법 값을 고려 시작 했죠; 하지만이 버그를 할 수있다 (예를 들어, 어떤 값 중 하나가 합법적으로 마법 값 경우?) :

SELECT CASE WHEN r = maxv THEN NULL ELSE r END AS result 
FROM (SELECT LEAST(NVL(:colA,maxv) 
        ,NVL(:colB,maxv) 
        ,NVL(:colC,maxv)) AS r, maxv 
     FROM (SELECT 9.999999999999999999999999999999999999999e125 
         AS maxv FROM DUAL)); 
0

세 '유착'호출에서 세 가지 주문이 세 가지 표현을 사용하고 '적어도 이러한 퍼팅 '호출은 3 개 이상의 표현식이 모두 null이 아니면 Null을 무시하고 최소 3 개를 생성합니다.

select least(coalesce(expr1, expr2, expr3), coalesce(expr2, expr3, expr1), coalesce(expr3, expr1, expr2)) from dual 
+0

죄송하지만 허용 된 답변이 나에게 잘 어울립니다. – Alexander

0

한 가지 방법은 자신의 LEAST/GREATEST FUNC의 버전을 정의하는 것입니다 :

-- here version for two params 
WITH FUNCTION least_improved(p1 IN NUMBER, p2 IN NUMBER) RETURN NUMBER IS 
BEGIN 
    IF p1 IS NULL THEN 
     RETURN p2; 
    ELSIF p2 IS NULL THEN 
     RETURN p1; 
    ELSE 
     RETURN LEAST(p1, p2); 
    END IF; 
END; 
SELECT least_improved(col1, col2) 
FROM table_name; 
/
관련 문제