Oracle null == null 확인
nullable 열의 데이터베이스 테이블을 검색하려고 합니다.때때로 제가 검색하는 값은 그 자체가 NULL입니다. NULL은 아무것도 아니므로 NULL은
where MYCOLUMN=SEARCHVALUE
실패합니다.나는 지금 당장 의지해야 한다.
where ((MYCOLUMN=SEARCHVALUE) OR (MYCOLUMN is NULL and SEARCHVALUE is NULL))
그렇게 간단하게 말할 수 있는 방법은 없나요?
(중요하다면 Oracle 사용)
IsNull이나 NVL 같은 작업을 수행할 수 있지만 엔진이 더 많은 작업을 수행할 수 있습니다.함수를 호출하여 열 변환을 수행하고 결과를 비교해야 합니다.
가지고 있는 것을 사용하다
where ((MYCOLUMN=SEARCHVALUE) OR (MYCOLUMN is NULL and SEARCHVALUE is NULL))
@Andy Lester는 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% 가까이 더 듭니다.따라서 하나의 코드가 다른 코드만큼 깔끔하거나 우아해 보이지 않더라도 훨씬 더 효율적일 수 있습니다.이 절차를 여러 번 실행했지만 결과는 매번 거의 비슷했습니다.앤디에게 경의를 표합니다.
Expert Oracle Database Architecture에서 본 내용:
WHERE DECODE(MYCOLUMN, SEARCHVALUE, 1) = 1
이게 더 간단한지는 모르겠지만, 가끔 이런 식으로
WHERE ISNULL(MyColumn, -1) = ISNULL(SearchValue, -1)
"-1"을 열 유형에 유효하지만 데이터에는 실제로 없을 수 있는 값으로 대체합니다.
메모: Oracle이 아닌 MS SQL을 사용하기 때문에 "ISNULL"이 유효한지는 확실하지 않습니다.
NVL을 사용하여 null을 다음과 같이 양쪽에서 더미 값으로 바꿉니다.
WHERE NVL(MYCOLUMN,0) = NVL(SEARCHVALUE,0)
다른 방법으로는 실행 쿼리 관점에서 최적이며 쿼리 생성을 수행하는 경우에만 유용합니다. 검색 값에 따라 필요한 쿼리를 생성하는 것입니다.
의사 코드가 이어집니다.
if (SEARCHVALUE IS NULL) {
condition = 'MYCOLUMN IS NULL'
} else {
condition = 'MYCOLUMN=SEARCHVALUE'
}
runQuery(query,condition)
아웃 오브 밴드 값이 가능한 경우:
where coalesce(mycolumn, 'out-of-band')
= coalesce(searchvalue, 'out-of-band')
해라
WHERE NVL(mycolumn,'NULL') = NVL(searchvalue,'NULL')
Oracle에서도 작업을 수행할 수 있습니다.
WHERE MYCOLUMN || 'X' = SEARCHVALUE || 'X'
OR을 사용하여 IS NULL 테스트를 이기는 경우가 있습니다.
또한 DECORD를 통해 NULL과 NULL을 대조할 수 있다는 사실에 놀랐습니다.
WITH
TEST AS
(
SELECT NULL A FROM DUAL
)
SELECT DECODE (A, NULL, 'NULL IS EQUAL', 'NULL IS NOT EQUAL')
FROM TEST
저는 당신이 가지고 있는 것이 괜찮다고 생각합니다.다음을 사용할 수 있습니다.
where NVL(MYCOLUMN, '') = NVL(SEARCHVALUE, '')
이는 보고서를 추진하는 Oracle 기능에 많은 문제가 있음을 알 수 있습니다.사용자가 값을 입력하여 결과를 제한하거나 공백으로 두면 모든 레코드가 반환됩니다.이것은 내가 사용해 온 것이고 우리에게 잘 작동해 왔다.
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)
언급URL : https://stackoverflow.com/questions/191640/determine-oracle-null-null
'programing' 카테고리의 다른 글
처리되지 않은 jQuery AJAX 오류 방지 (0) | 2023.03.09 |
---|---|
Oracle의 부울 필드 (0) | 2023.03.04 |
리액트에서 이진 데이터를 이미지로 표시하는 방법은 무엇입니까? (0) | 2023.03.04 |
Json Convert.사용되지 않는 날짜 형식을 사용하는 경우 DeserializeObject에서 문자열을 DateTime으로 변환할 수 없습니다. (0) | 2023.03.04 |
스프링 부트:휴지 상태 및 Flyway 부팅 순서 (0) | 2023.03.04 |