복붙노트

[SQL] 오라클 널 (null) == null이 결정

SQL

오라클 널 (null) == null이 결정

나는 널 (NULL) 컬럼에 데이터베이스 테이블을 검색하고 싶습니다. 가끔은를 검색하고있어 값 자체 NULL입니다. 널 이후 말, 아무것도, 심지어 NULL 같다

where MYCOLUMN=SEARCHVALUE 

실패합니다. 지금은에 의존해야

where ((MYCOLUMN=SEARCHVALUE) OR (MYCOLUMN is NULL and SEARCHVALUE is NULL))

그 말의 간단한 방법이 있나요?

(I 오라클을 사용하고 그 문제의 경우)

해결법

  1. ==============================

    1.당신은 ISNULL 또는 NVL 물건을 할 수 있지만, 단지 엔진이 더 많은 일을 할 수 있도록하는 것입니다. 그런 다음 비교 결과가 있어야 열 변환을 수행하는 함수를 호출 할 수 있습니다.

    당신은 ISNULL 또는 NVL 물건을 할 수 있지만, 단지 엔진이 더 많은 일을 할 수 있도록하는 것입니다. 그런 다음 비교 결과가 있어야 열 변환을 수행하는 함수를 호출 할 수 있습니다.

    당신이 무엇을 사용하여

    where ((MYCOLUMN=SEARCHVALUE) OR (MYCOLUMN is NULL and SEARCHVALUE is NULL))
    
  2. ==============================

    2.@Andy 레스터는 쿼리의 원래 형태가 NVL을 사용하는 것보다 더 효율적이라고 주장한다. 나는 그 주장을 테스트하기로 결정했다 :

    @Andy 레스터는 쿼리의 원래 형태가 NVL을 사용하는 것보다 더 효율적이라고 주장한다. 나는 그 주장을 테스트하기로 결정했다 :

        SQL> DECLARE
          2    CURSOR B IS
          3       SELECT batch_id, equipment_id
          4         FROM batch;
          5    v_t1  NUMBER;
          6    v_t2  NUMBER;
          7    v_c1  NUMBER;
          8    v_c2  NUMBER;
          9    v_b   INTEGER;
         10  BEGIN
         11  -- Form 1 of the where clause
         12    v_t1 := dbms_utility.get_time;
         13    v_c1 := dbms_utility.get_cpu_time;
         14    FOR R IN B LOOP
         15       SELECT COUNT(*)
         16         INTO v_b
         17         FROM batch
         18        WHERE equipment_id = R.equipment_id OR (equipment_id IS NULL AND R.equipment_id IS NULL);
         19    END LOOP;
         20    v_t2 := dbms_utility.get_time;
         21    v_c2 := dbms_utility.get_cpu_time;
         22    dbms_output.put_line('For clause: WHERE equipment_id = R.equipment_id OR (equipment_id IS NULL AND R.equipment_id IS NULL)');
         23    dbms_output.put_line('CPU seconds used: '||(v_c2 - v_c1)/100);
         24    dbms_output.put_line('Elapsed time: '||(v_t2 - v_t1)/100);
         25  
         26  -- Form 2 of the where clause
         27    v_t1 := dbms_utility.get_time;
         28    v_c1 := dbms_utility.get_cpu_time;
         29    FOR R IN B LOOP
         30       SELECT COUNT(*)
         31         INTO v_b
         32         FROM batch
         33        WHERE NVL(equipment_id,'xxxx') = NVL(R.equipment_id,'xxxx');
         34    END LOOP;
         35    v_t2 := dbms_utility.get_time;
         36    v_c2 := dbms_utility.get_cpu_time;
         37    dbms_output.put_line('For clause: WHERE NVL(equipment_id,''xxxx'') = NVL(R.equipment_id,''xxxx'')');
         38    dbms_output.put_line('CPU seconds used: '||(v_c2 - v_c1)/100);
         39    dbms_output.put_line('Elapsed time: '||(v_t2 - v_t1)/100);
         40  END;
         41  /
    
    
        For clause: WHERE equipment_id = R.equipment_id OR (equipment_id IS NULL AND R.equipment_id IS NULL)
        CPU seconds used: 84.69
        Elapsed time: 84.8
        For clause: WHERE NVL(equipment_id,'xxxx') = NVL(R.equipment_id,'xxxx')
        CPU seconds used: 124
        Elapsed time: 124.01
    
        PL/SQL procedure successfully completed
    
        SQL> select count(*) from batch;
    
      COUNT(*)
    ----------
         20903
    
    SQL> 
    

    나는 앤디가 얼마나 올바른 알아 놀라게의 종류이었다. NVL 솔루션을 수행하는 거의 50 % 더 많은 비용이 든다. 따라서, 하나의 코드가 다른 같은 깔끔한 또는 고급으로 보이지 않을 수도하더라도, 그것은 훨씬 더 효율적이 될 수 있습니다. 나는이 절차를 여러 번 실행하고, 결과는 매번 거의 동일 하였다. 앤디 했네 ...

  3. ==============================

    3.전문가 오라클 데이터베이스 아키텍처 I 톱에서 :

    전문가 오라클 데이터베이스 아키텍처 I 톱에서 :

    WHERE DECODE(MYCOLUMN, SEARCHVALUE, 1) = 1
    
  4. ==============================

    4.그것은 간단 나도 몰라,하지만 난 가끔 사용했습니다

    그것은 간단 나도 몰라,하지만 난 가끔 사용했습니다

    WHERE ISNULL(MyColumn, -1) = ISNULL(SearchValue, -1)
    

    교체 "-1"열 유형에 대한 유효하지만도하지 가능성이 실제로 데이터에서 찾을 수 일부 값.

    참고 : 내가 사용하는 MS SQL,하지 오라클은 "ISNULL은"유효 그렇게하지 않도록합니다.

  5. ==============================

    5.사용 NVL는 같이 양쪽에 몇 가지 더미 값이 널 (null)을 대체 :

    사용 NVL는 같이 양쪽에 몇 가지 더미 값이 널 (null)을 대체 :

    WHERE NVL(MYCOLUMN,0) = NVL(SEARCHVALUE,0)
    
  6. ==============================

    6.아마보기의 실행 질의 관점에서 최적의, 당신은 쿼리 생성 어떤 종류의 일을하는 경우에만 유용 할 것이다 또 다른 대안은, 당신은 검색 값에 따라 필요로하는 정확한 쿼리를 생성하는 것입니다.

    아마보기의 실행 질의 관점에서 최적의, 당신은 쿼리 생성 어떤 종류의 일을하는 경우에만 유용 할 것이다 또 다른 대안은, 당신은 검색 값에 따라 필요로하는 정확한 쿼리를 생성하는 것입니다.

    의사 코드는 다음과 같다.

    if (SEARCHVALUE IS NULL) {
        condition = 'MYCOLUMN IS NULL'
    } else {
        condition = 'MYCOLUMN=SEARCHVALUE'
    }
    runQuery(query,condition)
    
  7. ==============================

    7.대역 외 값이 가능한 경우 :

    대역 외 값이 가능한 경우 :

    where coalesce(mycolumn, 'out-of-band') 
        = coalesce(searchvalue, 'out-of-band')
    
  8. ==============================

    8.이것은 또한 오라클에서 일을 할 수 있습니다.

    이것은 또한 오라클에서 일을 할 수 있습니다.

    WHERE MYCOLUMN || 'X'  = SEARCHVALUE || 'X'
    

    는 OR와 IS NULL 테스트를 친다 몇 가지 상황이 있습니다.

    또한 DECODE 당신이 NULL에 대해 NULL을 확인할 수 있습니다 것을 놀랐습니다.

    WITH 
    TEST AS
    (
        SELECT NULL A FROM DUAL
    )
    SELECT DECODE (A, NULL, 'NULL IS EQUAL', 'NULL IS NOT EQUAL')
    FROM TEST
    
  9. ==============================

    9.시험

    시험

    WHERE NVL(mycolumn,'NULL') = NVL(searchvalue,'NULL')
    
  10. ==============================

    10.나는 당신이해야하는 것은 OK라고 생각합니다. 당신은 아마 사용할 수 있습니다 :

    나는 당신이해야하는 것은 OK라고 생각합니다. 당신은 아마 사용할 수 있습니다 :

    where NVL(MYCOLUMN, '') = NVL(SEARCHVALUE, '')
    
  11. ==============================

    11.이것은 우리가 우리의 오라클 기능 해당 드라이브의 보고서를 많이 자신을 찾을 수있는 상황이다. 우리는 사용자가 결과를 제한하거나 빈 모든 레코드를 반환 떠날 값을 입력 할 수 있도록합니다. 이것은 내가 사용하고 그것은 우리를 위해 잘 작동 한 것입니다.

    이것은 우리가 우리의 오라클 기능 해당 드라이브의 보고서를 많이 자신을 찾을 수있는 상황이다. 우리는 사용자가 결과를 제한하거나 빈 모든 레코드를 반환 떠날 값을 입력 할 수 있도록합니다. 이것은 내가 사용하고 그것은 우리를 위해 잘 작동 한 것입니다.

    WHERE rte_pending.ltr_rte_id = prte_id
      OR ((rte_pending.ltr_rte_id IS NULL OR rte_pending.ltr_rte_id IS NOT NULL)
          AND prte_id IS NULL)
    
  12. from https://stackoverflow.com/questions/191640/determine-oracle-null-null by cc-by-sa and MIT license