programing

where 절에 대한 Oracle/PL SQL/SQL null 비교

linuxpc 2023. 7. 5. 20:31
반응형

where 절에 대한 Oracle/PL SQL/SQL null 비교

거래에 대한 질문만 해도 쿼리에서 null 값이 됩니다.

예를 들어 다음과 같은 필드와 값을 가진 표가 있습니다.

TABLEX
Column1
1        
2        
3      
4        
5      
---------
Column2
null
A
B
C
null

특정 절차에 대한 변수 Y를 전달하고 있습니다.절차 내부에는 다음과 같은 커서가 있습니다.

CURSOR c_results IS
SELECT * FROM TABLEX where column2 = variableY

이제 문제는 변수 Y가 null이면 변수 Y가 null일 수 있고, 변수 Y가 null이면 A, B 또는 C가 될 수 있다는 것입니다. column2가 null이면 모든 레코드를 선택하고, 그렇지 않으면 column2가 A, B 또는 C입니다.

위의 커서/쿼리를 할 수 없습니다. 변수 Y가 null이면 비교가 다음과 같아야 하기 때문에 작동하지 않습니다.

CURSOR c_results IS
SELECT * FROM TABLEX where column2 IS NULL

null 또는 문자열 변수를 수용할 커서/쿼리를 사용해야 합니다.

제 질문이 조금 헷갈린다면 죄송합니다.저는 설명을 잘 못합니다.잘 부탁드립니다.

해당 매개 변수의 내용에 따라 다른 SQL을 생성하거나 다음과 같이 SQL을 변경합니다.

WHERE (column2 = variableY) OR (variableY IS NULL AND column2 IS NULL)

Oracle의 Ask Tom은 다음과 같이 말합니다.

where decode( col1, col2, 1, 0 ) = 0  -- finds differences

또는

where decode( col1, col2, 1, 0 ) = 1  -- finds sameness - even if both NULL

NULL 열을 동일한 열로 안전하게 비교

다음과 같은 방법을 사용할 수 있습니다.

SELECT * FROM TABLEX WHERE COALESCE(column2, '') = COALESCE(variableY, '')

(COALESCE는 첫 번째 NULL이 아닌 값을 사용합니다.)

열 내용이 " "(빈 문자열)일 수 없는 경우에만 사용할 수 있습니다.그렇지 않으면 NULL이 "(빈 문자열)과 일치하기 때문에 이 문은 실패합니다.

(edit) 다음을 고려할 수도 있습니다.

SELECT * FROM TABLEX WHERE COALESCE(column2, 'a string that never occurs') = COALESCE(variableY, 'a string that never occurs')

이것은 "실패 가설"을 수정할 것입니다.

아래는 "상위" 답변과 비슷하지만 더 간결합니다.

WHERE ((column2 = variableY ) or COALESCE( column2, variableY) IS NULL)

보고 있는 데이터에 따라 적절하지 않을 수도 있지만, 제가 본(그리고 사용한) 한 가지 요령은 NVL(필드 이름, 일부 존재하지 않는 값)을 비교하는 것입니다.

예를 들어 AGE가 선택적 열인 경우 다음을 사용할 수 있습니다.

if nvl(table1.AGE,-1) = nvl(table2.AGE,-1)

이것은 결코 허용되지 않을 것이라는 것을 알고 있는 가치가 있다는 것에 달려 있습니다.나이는 급여, 시퀀스 번호 및 음수일 수 없는 다른 숫자와 같은 좋은 예입니다.물론 스트링이 더 까다로울 수도 있습니다. 당신은 'xyzzymary had lamb' 같은 이름을 가진 사람은 절대 없을 것이라고 말할 수도 있지만, 당신이 그 가정을 가지고 달리는 날 그들은 그 이름을 가진 사람을 고용할 것이라는 것을 알고 있습니다!

이 모든 것이:"여기서 a = b 또는 (a는 null, b는 null)"은 이를 해결하는 전통적인 방법입니다.경험이 많은 프로그래머들도 가끔은 그 부분을 잊어버리기 때문에 불행한 일입니다.

사용해 보십시오.ISNULL()기능.변수가 null인지 확인할 수 있으며, 변수가 null이면 기본 반환 값을 설정할 수 있습니다. null을 null로 캠핑하는 것은 실제로 불가능합니다.기억: null <> null

WHERE variableY is null or column2 = variableY 

for example:
create table t_abc (
id number(19) not null,
name varchar(20)
);

insert into t_abc(id, name) values (1, 'name');
insert into t_abc(id, name) values (2, null);
commit;

select * from t_abc where null is null or name = null;
--get all records

select * from t_abc where 'name' is null or name = 'name';
--get one record with name = 'name'

사용할 수 있습니다.DUMP:

SELECT * 
FROM TABLEX 
WHERE DUMP(column2) = DUMP(variableY);

DB Fidle 데모

경고:이 식은 SARG 지원 식이 아니므로 인덱스 사용이 사용되지 않습니다.

이 접근 방식을 사용하면 데이터에 존재하지 않는 가치를 검색할 필요가 없습니다(예:NVL/COALESCE).

언급URL : https://stackoverflow.com/questions/16896540/oracle-pl-sql-sql-null-comparison-on-where-clause

반응형