복붙노트

[SQL] SQL은하지 쿼리와 동일한에 널 값을 표시하지?

SQL

SQL은하지 쿼리와 동일한에 널 값을 표시하지?

이 호기심 단지 질문이다 그러나 나는 데이터베이스보고 열 중 하나에 대한 쿼리와 테이블에서 데이터를 당겨입니다. 내가 쿼리 등을 실행하면 열이 네 가지 값 NULL, 0, 1, 2가 있습니다 :

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

나는 실행하는 것과 같은 결과를 얻을 :

SELECT * FROM STATUS WHERE STATE = '0';

즉 조회 된 칼럼에서 최고의 명령에 널 (null) 값을 가진 행이 항상 SQL에서 일어나는 않는 결과에서 생략 할 것 같다?

나는 오라클 SQL 개발자를 통해 내 명령을 실행하고 있습니다.

해결법

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

    1.여러 언어에서 NULL은 다르게 처리한다 : 대부분의 사람들은 두 개의 값 논리 곳 진실과 거짓에 대해 알고있는 부울 식의 비교가 값이 (심지어 거짓은 0으로 정의하고 다른 것 같은 사실이다).

    여러 언어에서 NULL은 다르게 처리한다 : 대부분의 사람들은 두 개의 값 논리 곳 진실과 거짓에 대해 알고있는 부울 식의 비교가 값이 (심지어 거짓은 0으로 정의하고 다른 것 같은 사실이다).

    표준 SQL에서는 3 치 논리에 대해 생각해야합니다. NULL이 실제 값으로 처리되지 않으며, 당신은 오히려 "알"을 호출 할 수 있습니다. 귀하의 경우 상태는 0, 1, 또는 다른 어떤 경우에 따라서 값이 불명 한 경우는 명확하지 않다. NULL 그래서! = NULL로 한 결과를 다시.

    이것은 당신이 NULL이 될 수 있습니다 뭔가를 필터링 whereever, 당신이 스스로 치료 NULL 값을 가지고 결론 지었다. 구뿐만 아니라 다른 참고 : NULL 값이 오직 X와 비교 될 수 대신 X = NULL의 NULL이다. 논리 연산의 결과를 나타내는 진리표에 대한 위키 백과를 참조하십시오.

  2. ==============================

    2.정상의 Yest 것을 고정에, 당신은 아마 데이터베이스 설정을 넣을 수 있습니다

    정상의 Yest 것을 고정에, 당신은 아마 데이터베이스 설정을 넣을 수 있습니다

    그러나 당신은 당신의 코드를 수정하고 그런 식으로 뭔가를 할 수 :

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

    더 많은 정보를 원하시면,이 봐 : http://www.w3schools.com/sql/sql_null_values.asp

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

    3.여러 나의 신속 읽기 어려워 질 수있는 곳으로 그리고 결과로 불확실.

    여러 나의 신속 읽기 어려워 질 수있는 곳으로 그리고 결과로 불확실.

    나는 예를 들어, 별도의 괄호 플러스 (이 경우 NOT IN)은 IN 문장의 사용을 권장합니다

    상태 SELECT * FROM WHERE (주 NOT IN ( '1', '2')) 또는 STATE가 null;

    Implmentations 데이터베이스 공급 업체 그러나 확인 결과를 확인해야 위의 명시 적 문법에 따라 다를 수 있습니다.

  4. ==============================

    4.그래서처럼 사용 NVL !! STATUS FROM SELECT * WHERE NVL (STATE, 'X') = '1'AND NVL (STATE, 'X') = '2';

    그래서처럼 사용 NVL !! STATUS FROM SELECT * WHERE NVL (STATE, 'X') = '1'AND NVL (STATE, 'X') = '2';

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

    5.나는 오라클 동작을 조회 스크립트를 생성 :

    나는 오라클 동작을 조회 스크립트를 생성 :

    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)
    
  6. from https://stackoverflow.com/questions/8036691/sql-not-displaying-null-values-on-a-not-equals-query by cc-by-sa and MIT license