programing

같지 않은 쿼리에 null 값을 표시하지 않는 SQL입니까?

madecode 2023. 4. 1. 23:25
반응형

같지 않은 쿼리에 null 값을 표시하지 않는 SQL입니까?

그냥 궁금해서 묻는 질문인데, 데이터베이스를 보고 한 열에 대한 쿼리가 있는 테이블에서 데이터를 꺼냅니다.열에는 4개의 가능한 값이 있습니다.null,0,1,2. 쿼리를 실행하는 경우:

SELECT * FROM STATUS WHERE STATE != '1' AND STATE != '2';

실행과 동일한 결과를 얻을 수 있습니다.

SELECT * FROM STATUS WHERE STATE = '0';

즉, 조회된 열의 top 명령어에 null 값이 있는 행은 결과에서 제외된 것으로 보이는데, SQL에서는 항상 이러한 현상이 발생합니까?

Oracle SQL Developer를 통해 명령을 실행하고 있습니다.

여러 언어에서 NULL은 다르게 처리됩니다.대부분의 사람들은 2개의 값 로직에 대해 알고 있습니다.true그리고.false는 부울식 내에서 유일하게 동등한 값입니다(false도 0으로 정의되며 true는 기타 모든 것으로 정의됩니다).

표준 SQL에서는 3개의 값 로직을 고려해야 합니다.NULL은 실제 값으로 취급되지 않습니다.알 수 없는 값이라고 할 수 있습니다.따라서 값을 알 수 없는 경우 사용자의 경우 명확하지 않습니다.state0, 1 또는 기타입니다.그렇게NULL != 1결과NULL다시.

즉, NULL일 가능성이 있는 것을 필터링 하는 경우, NULL 값은 스스로 처리할 필요가 있습니다.구문도 다르다는 점에 주의해 주십시오.NULL 값은 비교가 가능합니다.x IS NULL대신x = NULL논리 연산 결과를 나타내는 진실 표는 Wikipedia를 참조하십시오.

정상이지만 데이터베이스 설정을 사용하여 수정할 수 있습니다.

그러나 코드를 수정하여 다음과 같은 작업을 수행할 수 있습니다.

SELECT * FROM STATUS WHERE STATE != '1' OR STATE != '2' or STATE is null;

자세한 것은, http://www.w3schools.com/sql/sql_null_values.asp 를 참조해 주세요.

복수or님의where는 금방 읽기 어려워지고 결과에 대해서도 불명확해질 수 있습니다.

추가 괄호 및 를 사용하는 것이 좋습니다.IN스테이트먼트(NOT IN이 경우) 예를 들어,

SELECT * FROM STATUS WHERE (STATE NOT IN ('1', '2')) or STATE is null;

시사하는 바는 데이터베이스 벤더에 따라 다를 수 있지만 위의 명시적 구문은 결과를 확인해야 합니다.

사용하다NVL다음과 같이 합니다.SELECT * FROM STATUS WHERE NVL(STATE,'X') != '1' AND NVL(STATE,'X')!= '2';

Oracle 동작을 조사하기 위한 스크립트를 작성했습니다.

create table field_values
(
is_user_deletable VARCHAR2(1 CHAR),
resource_mark VARCHAR2(3 CHAR)
)

insert into field_values values (NULL, NULL);
insert into field_values values ('Y', NULL);
insert into field_values values ('N', NULL);

select * from field_values; -- 3 row

-- 1 row, bad
update field_values set resource_mark = 'D' where is_user_deletable = 'Y'; 
update field_values set resource_mark = 'D' where is_user_deletable <> 'N'; 
update field_values set resource_mark = 'D' where is_user_deletable != 'N'; 
update field_values set resource_mark = 'D' where is_user_deletable not in ('Y');

-- 2 rows, good, but needs more SQL and more comparisons. Does DB optimizes?
update field_values set resource_mark = 'D' where is_user_deletable = 'N' or is_user_deletable is null; 

-- it better to have ('Y' and NULL) or ('N' and NULL), but not 'Y' and 'N' and NULL (avoid quires with https://en.wikipedia.org/wiki/Three-valued_logic)
-- adding new column which is 'Y' or 'N' only into existing table may be very long locking operation on existing table (or running long DML script)

언급URL : https://stackoverflow.com/questions/8036691/sql-not-displaying-null-values-on-a-not-equals-query

반응형