복붙노트

[SQL] 또는 NULL에 절 IS NULL

SQL

또는 NULL에 절 IS NULL

포스트 그레스 데이터베이스입니다

나는 IN 절에 대한 NULL 값을 사용할 수 있습니까? 예:

SELECT *
FROM tbl_name
WHERE id_field IN ('value1', 'value2', 'value3', NULL)

나는이 네 개의 값으로 제한합니다.

잘 실행하지만 NULL의 id_fields에 레코드를 추가하지 않습니다, 나는 위의 문을 시도하고 작동하지 않습니다.

나는 또한 OR 조건을 추가하기 위해 시도했지만 이것은 단지 쿼리 실행을하고 시야에 끝 실행합니다.

SELECT *
FROM tbl_name
WHERE other_condition = bar
AND another_condition = foo
AND id_field IN ('value1', 'value2', 'value3')
OR id_field IS NULL

어떤 제안?

해결법

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

    1.(마크 B에 의해 설명)

    (마크 B에 의해 설명)

    나는 명확성을 위해이 작업을 수행 할 것

    SELECT *
    FROM tbl_name
    WHERE 
    (id_field IN ('value1', 'value2', 'value3') OR id_field IS NULL)
    
  2. ==============================

    2.귀하의 질의 연산자 우선 순위로 인해 실패합니다. 그리고 바인딩 전에 OR! 당신은 "선명도"의 문제가 아니다 괄호 쌍,하지만 순수 논리의 필요성을해야합니다.

    귀하의 질의 연산자 우선 순위로 인해 실패합니다. 그리고 바인딩 전에 OR! 당신은 "선명도"의 문제가 아니다 괄호 쌍,하지만 순수 논리의 필요성을해야합니다.

    SELECT *
    FROM   tbl_name
    WHERE  other_condition = bar
    AND    another_condition = foo
    AND   (id_field IN ('value1', 'value2', 'value3') OR id_field IS NULL)

    추가 된 괄호 방지하기 전에 바인딩 OR. 이 WHERE 조건 (더 AND) 다른 없다면 괄호 필요하지 않을 것입니다. 허용 대답은이 점에 오해의 소지가 조금있다.

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

    3.

    SELECT *
    FROM tbl_name
    WHERE coalesce(id_field,'unik_null_value') 
    IN ('value1', 'value2', 'value3', 'unik_null_value')
    

    그래서 당신은 체크에서 널 (null)을 제거하는 것이다. id_field가 value1-3 또는 null입니다 id_field에 널 (null) 값을 감안하면 병합 기능을 대신 null이 반환 'unik_null_value'의, 그리고 IN-목록 'unik_null_value을 추가하여 쿼리 게시물을 반환합니다.

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

    4.다니엘 응답으로 질문 perfctly 괜찮습니다. 나는 NULLS에 대한 메모를 남겨 싶었다. 우리는 열이 NULL 값을 포함 할 때 운영자가 아닌 사용에 대한주의 하시고한다. 당신의 열이 NULL 값을 포함하고 NOT IN 연산자를 사용하는 경우에는 모든 출력을받지 않습니다. 이것은의, 이상 여기 http://www.oraclebin.com/2013/01/beware-of-nulls.html I가 건너 와서 그것을 공유 생각 아주 좋은 기사를 설명하는 방법입니다.

    다니엘 응답으로 질문 perfctly 괜찮습니다. 나는 NULLS에 대한 메모를 남겨 싶었다. 우리는 열이 NULL 값을 포함 할 때 운영자가 아닌 사용에 대한주의 하시고한다. 당신의 열이 NULL 값을 포함하고 NOT IN 연산자를 사용하는 경우에는 모든 출력을받지 않습니다. 이것은의, 이상 여기 http://www.oraclebin.com/2013/01/beware-of-nulls.html I가 건너 와서 그것을 공유 생각 아주 좋은 기사를 설명하는 방법입니다.

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

    5.참고 : 외부 링크가 Sushant BUTTA의 대답에 죽은 사람이 주장 때문에 것을 내가 별도의 답변으로 여기에 콘텐츠를 게시했습니다.

    참고 : 외부 링크가 Sushant BUTTA의 대답에 죽은 사람이 주장 때문에 것을 내가 별도의 답변으로 여기에 콘텐츠를 게시했습니다.

    NULLS 조심하십시오.

    사업자 IN IN을 사용하지 않으면 서 오늘은 쿼리의 매우 이상한 행동을 가로 질러왔다. 사실은 내가 두 테이블을 비교하고 표 B의 값은 표 A에 존재하는지 여부를 확인 여부 및 열 containsnull 값의 경우의 동작을 알아 싶었다. 난 그냥있는 환경을 만들어 그래서이 동작을 테스트합니다.

    우리는 테이블 table_a를 생성합니다.

    SQL> create table table_a ( a number);
    Table created.
    

    우리는 테이블 table_b을 생성합니다.

    SQL> create table table_b ( b number);
    Table created.
    

    table_a에 일부 값을 삽입합니다.

    SQL> insert into table_a values (1);
    1 row created.
    
    SQL> insert into table_a values (2);
    1 row created.
    
    SQL> insert into table_a values (3);
    1 row created.
    

    table_b으로 일부 값을 삽입합니다.

    SQL> insert into table_b values(4);
    1 row created.
    
    SQL> insert into table_b values(3);
    1 row created.
    

    이제 우리는 IN 연산자를 사용하여 table_b에서 그 값을 확인하여 table_a의 값의 존재를 확인하는 쿼리를 실행합니다.

    SQL> select * from table_a where a in (select * from table_b);
             A
    ----------
             3
    

    비 존재를 확인하기 위해 쿼리 아래 실행합니다.

    SQL> select * from table_a where a not in (select * from table_b);
             A
    ----------
             1
             2
    

    예상대로 출력했다. 이제 우리는 테이블 table_b에 NULL 값을 삽입하고 위의 두 쿼리가 어떻게 행동하는지 볼 수 있습니다.

    SQL> insert into table_b values(null);
    1 row created.
    
    SQL> select * from table_a where a in (select * from table_b);
             A
    ----------
             3
    
    SQL> select * from table_a where a not in (select * from table_b);
    
    no rows selected
    

    첫 번째 쿼리는 예상대로 행동하지만 두 번째 쿼리에 무슨 일이? 우리가 어떤 출력을하지 않았다 왜, 무슨 일이 일어날 것인가? 쿼리에 어떤 차이가 있나요? 아니.

    변화는 표 table_b의 데이터이다. 우리는 테이블에 널 (null) 값을 도입했습니다. 하지만 어떻게는이처럼 행동있어 올? 의는 "AND"및 "OR"연산자로 두 개의 쿼리를 나누어 보자.

    첫 번째 쿼리는 다음과 같은 내부적으로 일을 처리됩니다. 처음 두 피연산자가 true 또는 false로 평가됩니다 그래서 널 여기에 문제를 만들지 않습니다. 그러나 세 번째 A = 널 (null) 피연산자는 둘 다 참이나 거짓으로 평가하지 않습니다. 그것은 단지 null로 평가합니다.

    select * from table_a whara a = 3 or a = 4 or a = null;
    
    a = 3  is either true or false
    a = 4  is either true or false
    a = null is null
    

    두 번째 질의는 다음과 같이 처리됩니다. 우리는 피연산자의에서 "AND"연산자와 진정한 이외를 사용하고 있기 때문에 나에게 출력을 제공하지 않습니다.

    select * from table_a whara a <> 3 and a <> 4 and a <> null;
    
    a <> 3 is either true or false
    a <> 4 is either true or false
    a <> null is null
    

    그래서 우리는 어떻게이 문제를 해결할 수 있습니까? 운영자가 아닌 사용하는 동안 우리는 테이블 table_b의 모든 NOT NULL 값을 선택할 것입니다.

    SQL> select * from table_a where a not in (select * from table_b where b is not null);
    
             A
    ----------
             1
             2
    

    운영자가 아닌 사용하는 동안 그래서 항상 열에 NULL 값에 대한주의하십시오.

    NULL 조심!

  6. ==============================

    6.나는 그 대답에 늦게 알고 있지만 다른 사람이 유용 할 수있다 당신은 하위 쿼리를 사용하고 0으로 널을 변환 할 수 있습니다

    나는 그 대답에 늦게 알고 있지만 다른 사람이 유용 할 수있다 당신은 하위 쿼리를 사용하고 0으로 널을 변환 할 수 있습니다

    SELECT *
    FROM (SELECT CASE WHEN id_field IS NULL 
                    THEN 0 
                    ELSE id_field 
                END AS id_field
          FROM tbl_name) AS tbl
    WHERE tbl.id_field IN ('value1', 'value2', 'value3', 0)
    
  7. ==============================

    7.널 데이터의 부재를 의미한다. 널은 공식적으로 사용할 수없는 할당되지 않은, 알 수 없거나 적용 할 것입니다 값 (OCA 오라클 데이터베이스 12C, SQL 기본 I 시험 가이드, P87)으로 정의된다. 그래서, 당신은 열이 "에서"나 절에 "하지에서"사용하여 제한되는 것을 때 널 (null) 값이 포함 된 열이 기록을 볼 수 없습니다.

    널 데이터의 부재를 의미한다. 널은 공식적으로 사용할 수없는 할당되지 않은, 알 수 없거나 적용 할 것입니다 값 (OCA 오라클 데이터베이스 12C, SQL 기본 I 시험 가이드, P87)으로 정의된다. 그래서, 당신은 열이 "에서"나 절에 "하지에서"사용하여 제한되는 것을 때 널 (null) 값이 포함 된 열이 기록을 볼 수 없습니다.

  8. from https://stackoverflow.com/questions/6362112/in-clause-with-null-or-is-null by cc-by-sa and MIT license