programing

IN 절(NULL 또는 IS NULL)

madecode 2023. 5. 11. 23:17
반응형

IN 절(NULL 또는 IS NULL)

Postgres는 데이터베이스입니다.

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

좋은 의견이라도 있나?

in문은 다음과 동일하게 구문 분석됩니다.field=val1 or field=val2 or field=val3거기에 null을 넣으면 다음으로 요약됩니다.field=null효과가 없을 겁니다

(Marc B의 논평)

저는 명확성을 위해 이것을 할 것입니다.

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

연산자 우선 순위로 인해 쿼리가 실패합니다. AND앞에 묶인.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);

추가된 괄호는 다음을 방지합니다.AND앞에 구속력이 있는.OR다른 사람이 없다면,WHERE조건(아니오)AND추가 괄호가 필요하지 않습니다.이 점에서 받아들여진 답변은 오해의 소지가 있습니다.

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

따라서 검사에서 null을 제거합니다.id_field에 null 값이 주어지면 병합 함수는 null 대신 'unic_null_value'를 반환하고, IN-list에 'unic_null_value'를 추가하여 쿼리는 id_field가 value1-3 또는 null인 게시물을 반환합니다.

다니엘이 대답한 질문은 완벽하게 괜찮습니다.NULLS에 대한 메모를 남기고 싶습니다.열에 NULL 값이 포함된 경우 NOT IN 연산자를 사용하는 데 주의해야 합니다.열에 NULL 값이 포함되어 있고 NOT IN 연산자를 사용하는 경우 출력을 얻을 수 없습니다.여기 http://www.oraclebin.com/2013/01/beware-of-nulls.html 에서 이렇게 설명되어 있습니다. 제가 우연히 발견하고 공유하려고 생각한 아주 좋은 기사입니다.

참고: Suschant Butta님의 답변에 외부 링크가 죽었다고 누군가 주장했기 때문에 별도의 답변으로 여기에 내용을 올렸습니다.

NULLs를 주의하십시오.

오늘 저는 IN을 사용하는 동안 매우 이상한 쿼리 동작을 발견했습니다.NOT IN연산자사실 저는 두 표를 비교해서 다음 값이table b에 존재한table a또는 그렇지 않고 열에 다음이 포함된 경우 해당 동작을 확인합니다.null가치.그래서 저는 이 행동을 테스트하기 위한 환경을 만들었습니다.

는 테이블을 입니다.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.

이쿼리실행값있확다인니합는이지여제에 하겠습니다.table_a 확으로써인함치▁from써▁its▁▁value에서 그 값을 확인함으로써.table_b용사를 IN교환입니다.

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

예상대로 결과가 나왔습니다. 이다을삽다니합입음제를 하겠습니다.null의 값table_b위의 두 쿼리가 어떻게 작동하는지 확인합니다.

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"교환입니다.

첫 번째 쿼리:

첫 번째 쿼리는 내부적으로 처리됩니다.비상대기상태null나의 처음 두 피연산자가 평가하기 때문에 여기에 문제를 만들지 않을 것입니다.true또는false 저의 세 피연산자인 하만세번째피는자산연지는▁but자산▁my피.a = null 않가것다니입을▁to▁evaluate다▁neither니▁will.true도 아니다false그것은 평가할 것입니다.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"및 연자및이모항든목 이외의 true어떤 피연산자도 나에게 어떤 출력도 주지 않을 것입니다.

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

어떻게 처리해야 할까요?가 저가다뽑희을게요▁the요뽑▁we▁all게▁will▁pick을다.not null 의 의 값table_b를 사용하는 NOT IN교환입니다.

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

         A
----------
         1
         2

해야 돼요.NULL에 합니다.NOT IN교환입니다.

NULL을 주의하십시오!!

답변이 늦었지만 다른 사용자에게 유용할 수 있습니다. 하위 쿼리를 사용하고 null을 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)

Null데이터가 없는 것을 말합니다. Null는 공식적으로 사용할 수 없거나, 할당되지 않았거나, 알 수 없거나, 적용할 수 없는 값으로 정의됩니다(OCA Oracle Database 12c, SQL Fundamentals I Exam Guide, p87).따라서 "in" 또는 "not in" 절을 사용하여 해당 열을 제한할 경우 null 값이 포함된 열이 있는 레코드가 표시되지 않을 수 있습니다.

언급URL : https://stackoverflow.com/questions/6362112/in-clause-with-null-or-is-null

반응형