source

Oracle SQL의 최소 값이지만 NULL은 아닙니다.

factcode 2023. 10. 21. 10:52
반응형

Oracle SQL의 최소 값이지만 NULL은 아닙니다.

가장 작은 값을 찾기 위해 절차에서 기능을 최소로 사용하고 싶었습니다.문제는 일부 값이 NULL일 수도 있다는 점입니다. 만약 제가 NULL일 수도 있습니다.

select least(NULL,0,1) from dual

제가 받는 답변은 NULL인데, 아마 제가 반환할 것으로 예상되는 것은 아닐 것입니다.0이 아닌 최소한의 실제 값을 받고 싶습니다.어떤 도움이라도 주신다면 대단히 감사하겠습니다.

인수가 NULL이면 다른 인수 중 가장 적은 값을 사용하려고 합니다.모든 인수가 NULL이면 NULL을 반환합니다.

저는 두 가지 논쟁에 이와 같은 것을 사용할 수 있습니다.

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

2개 이상의 인수에 대해서는 보기 흉해지기 시작합니다.

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

그게 정말 당신의 질문이 아닌가 봅니다.어쩌면 이런 짓을 하고 있는 건 아닐까요?

select least(some_column) from dual

그렇다면 다음과 같이 변경합니다.

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

아니면, 이와 같은 일을 하고 있다면, 그냥 사용할 수 없는 곳에서.where세트를 필터링하려면,

select least(expr1,expr2,expr3) from dual

다음 작업을 수행합니다.

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

어디에12345값이 충분히 커서 다른 모든 식들이 다음과 같은 경우에만 선택될 것입니다.NULL.

세 개의 식을 세 개의 '연합' 호출에서 세 개의 순서로 사용하고 세 개의 식을 '최소' 호출에 넣으면 세 개 중 가장 적은 값이 되며, 세 개의 식이 모두 null이 아닌 경우에는 null을 무시합니다.

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

열 1부터 N까지의 가장 낮은 값:

SELECT
    LEAST(COALESCE(Col1, BINARY_DOUBLE_INFINITY),
          COALESCE(Col2, BINARY_DOUBLE_INFINITY),
          ... ,
          COALESCE(ColN, BINARY_DOUBLE_INFINITY)
    )
FROM MY_TABLE

열 1부터 N까지의 최대 값:

SELECT
    GREATEST(
        COALESCE(Col1, -BINARY_DOUBLE_INFINITY),
        COALESCE(Col2, -BINARY_DOUBLE_INFINITY),
        ..., 
        COALESCE(ColN, -BINARY_DOUBLE_INFINITY)
    )
FROM MY_TABLE

쿼리에서 무한대 결과를 제거하려면 모든 값이 null인지 확인하는 where 절을 추가하면 됩니다.이 작업은 Coales 함수를 사용하여 수행할 수도 있습니다.

WHERE COALESCE(Col1, Col2, ..., ColN) IS NOT NULL

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

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

min & max를 원하는 열이 많을 경우, 해당 열을 단일 열로 분리할 수 있습니다. 그러면 단순하게 됩니다. 단일 열에서 NULLS를 제외하고 MIN() 또는 MAX()를 사용하여 원하는 것을 얻을 수 있습니다.

약 50개의 날짜 열로 이 작업을 수행해야 했는데(훌륭한 db 디자인은 아님) UNPIVOT가 가장 합리적인/실천적인 방법인 것 같았습니다.

SELECT least(1, 2, 3, nvl(NULL,4)) FROM dual

반품 : 1

SELECT GREATEST(1, 2, 3, nvl(NULL,0)) FROM dual

반품 : 3

언급URL : https://stackoverflow.com/questions/21313770/least-value-but-not-null-in-oracle-sql

반응형