[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.당신은 ISNULL 또는 NVL 물건을 할 수 있지만, 단지 엔진이 더 많은 일을 할 수 있도록하는 것입니다. 그런 다음 비교 결과가 있어야 열 변환을 수행하는 함수를 호출 할 수 있습니다.
당신은 ISNULL 또는 NVL 물건을 할 수 있지만, 단지 엔진이 더 많은 일을 할 수 있도록하는 것입니다. 그런 다음 비교 결과가 있어야 열 변환을 수행하는 함수를 호출 할 수 있습니다.
당신이 무엇을 사용하여
where ((MYCOLUMN=SEARCHVALUE) OR (MYCOLUMN is NULL and SEARCHVALUE is NULL))
-
==============================
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.전문가 오라클 데이터베이스 아키텍처 I 톱에서 :
전문가 오라클 데이터베이스 아키텍처 I 톱에서 :
WHERE DECODE(MYCOLUMN, SEARCHVALUE, 1) = 1
-
==============================
4.그것은 간단 나도 몰라,하지만 난 가끔 사용했습니다
그것은 간단 나도 몰라,하지만 난 가끔 사용했습니다
WHERE ISNULL(MyColumn, -1) = ISNULL(SearchValue, -1)
교체 "-1"열 유형에 대한 유효하지만도하지 가능성이 실제로 데이터에서 찾을 수 일부 값.
참고 : 내가 사용하는 MS SQL,하지 오라클은 "ISNULL은"유효 그렇게하지 않도록합니다.
-
==============================
5.사용 NVL는 같이 양쪽에 몇 가지 더미 값이 널 (null)을 대체 :
사용 NVL는 같이 양쪽에 몇 가지 더미 값이 널 (null)을 대체 :
WHERE NVL(MYCOLUMN,0) = NVL(SEARCHVALUE,0)
-
==============================
6.아마보기의 실행 질의 관점에서 최적의, 당신은 쿼리 생성 어떤 종류의 일을하는 경우에만 유용 할 것이다 또 다른 대안은, 당신은 검색 값에 따라 필요로하는 정확한 쿼리를 생성하는 것입니다.
아마보기의 실행 질의 관점에서 최적의, 당신은 쿼리 생성 어떤 종류의 일을하는 경우에만 유용 할 것이다 또 다른 대안은, 당신은 검색 값에 따라 필요로하는 정확한 쿼리를 생성하는 것입니다.
의사 코드는 다음과 같다.
if (SEARCHVALUE IS NULL) { condition = 'MYCOLUMN IS NULL' } else { condition = 'MYCOLUMN=SEARCHVALUE' } runQuery(query,condition)
-
==============================
7.대역 외 값이 가능한 경우 :
대역 외 값이 가능한 경우 :
where coalesce(mycolumn, 'out-of-band') = coalesce(searchvalue, 'out-of-band')
-
==============================
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.시험
시험
WHERE NVL(mycolumn,'NULL') = NVL(searchvalue,'NULL')
-
==============================
10.나는 당신이해야하는 것은 OK라고 생각합니다. 당신은 아마 사용할 수 있습니다 :
나는 당신이해야하는 것은 OK라고 생각합니다. 당신은 아마 사용할 수 있습니다 :
where NVL(MYCOLUMN, '') = NVL(SEARCHVALUE, '')
-
==============================
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)
from https://stackoverflow.com/questions/191640/determine-oracle-null-null by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] IF는 조건이 PLSQL 작동하지 EXISTS (0) | 2020.04.26 |
---|---|
[SQL] SQL Server 관리 Studio에서 스크립트를 생성 (0) | 2020.04.26 |
[SQL] ROW_NUMBER와 별개의 SQL 쿼리 (0) | 2020.04.26 |
[SQL] 무결성 제약 조건 위반 : 1452 추가 또는 자식 행을 업데이트 할 수 없습니다 : (0) | 2020.04.26 |
[SQL] 오라클 SQL 이스케이프 문자 ( '&'A에 대한) (0) | 2020.04.26 |