programing

SQL(MariaDB) NULL 값이 무시됩니다.

skycolor 2023. 10. 24. 21:10
반응형

SQL(MariaDB) NULL 값이 무시됩니다.

MariaDB의 클라이언트에서mycli전 그러려고 합니다.SELECT가치가 있는 물건.vend_country둘 중 하나입니다NULL아니면MI그래서 저는 이렇게 간단한 질문을 했습니다.

SELECT * 
FROM vendors
WHERE vend_state IN (NULL,'MI');

결과물이 나왔습니다.

+-----------+-------------+-----------------+-------------+--------------+------------+----------------+
|   vend_id | vend_name   | vend_address    | vend_city   | vend_state   |   vend_zip | vend_country   |
|-----------+-------------+-----------------+-------------+--------------+------------+----------------|
|      1001 | Anvils R Us | 123 Main Street | Southfield  | MI           |      48075 | USA            |
+-----------+-------------+-----------------+-------------+--------------+------------+----------------+

이상한 거죠, 왜냐면 그 줄들이 빠진 것 같기 때문이죠.NULL동일한 표에 있는 값입니다.이 쿼리는 다음을 보여줍니다.

SELECT * 
FROM vendors;

출력에는 첫 번째 쿼리와 함께 출력해야 하는 null 값을 가진 두 개의 행이 명확하게 표시됩니다.

+-----------+----------------+-----------------+-------------+--------------+------------+----------------+
|   vend_id | vend_name      | vend_address    | vend_city   | vend_state   | vend_zip   | vend_country   |
|-----------+----------------+-----------------+-------------+--------------+------------+----------------|
|      1001 | Anvils R Us    | 123 Main Street | Southfield  | MI           | 48075      | USA            |
|      1002 | LT Supplies    | 500 Park Street | Anytown     | OH           | 44333      | USA            |
|      1003 | ACME           | 555 High Street | Los Angeles | CA           | 90046      | USA            |
|      1004 | Furball Inc.   | 1000 5th Avenue | New York    | NY           | 11111      | USA            |
|      1005 | Jet Set        | 42 Galaxy Road  | London      | <null>       | N16 6PS    | England        |
|      1006 | Jouets Et Ours | 1 Rue Amusement | Paris       | <null>       | 45678      | France         |
+-----------+----------------+-----------------+-------------+--------------+------------+----------------+

저는 또한 다른 쿼리를 시도해 보았는데, 이것은 또한 다음과 같은 행을 무시합니다.NULL값:

mariadb root@localhost:crashcourse>  SELECT * 
                                 ->  FROM vendors
                                 ->  WHERE vend_state IN ('<null>','MI');
+-----------+-------------+-----------------+-------------+--------------+------------+----------------+
|   vend_id | vend_name   | vend_address    | vend_city   | vend_state   |   vend_zip | vend_country   |
|-----------+-------------+-----------------+-------------+--------------+------------+----------------|
|      1001 | Anvils R Us | 123 Main Street | Southfield  | MI           |      48075 | USA            |
+-----------+-------------+-----------------+-------------+--------------+------------+----------------+


mariadb root@localhost:crashcourse>  SELECT * 
                                 ->  FROM vendors
                                 ->  WHERE vend_state IN ('NULL','MI');
+-----------+-------------+-----------------+-------------+--------------+------------+----------------+
|   vend_id | vend_name   | vend_address    | vend_city   | vend_state   |   vend_zip | vend_country   |
|-----------+-------------+-----------------+-------------+--------------+------------+----------------|
|      1001 | Anvils R Us | 123 Main Street | Southfield  | MI           |      48075 | USA            |
+-----------+-------------+-----------------+-------------+--------------+------------+----------------+

반면에 이것은 완전히 잘 작동하기 때문에.IN키워드가 작동 중이어야 합니다.

SELECT * 
FROM vendors
WHERE vend_id IN (1001,1005);

+-----------+-------------+-----------------+-------------+--------------+------------+----------------+
|   vend_id | vend_name   | vend_address    | vend_city   | vend_state   | vend_zip   | vend_country   |
|-----------+-------------+-----------------+-------------+--------------+------------+----------------|
|      1001 | Anvils R Us | 123 Main Street | Southfield  | MI           | 48075      | USA            |
|      1005 | Jet Set     | 42 Galaxy Road  | London      | <null>       | N16 6PS    | England        |
+-----------+-------------+-----------------+-------------+--------------+------------+----------------+

그럼 누가 말해줄 수 있나요? 어떻게 검색할 수 있나요?NULL값을 사용IN키워드?

사용할 수 없습니다.NULL와는 완전히 같은IN().

두 가지 옵션은 다음과 같습니다.

당신의 것을 분리합니다.NULL필터:

SELECT * 
FROM vendors
WHERE vend_state IN ('MI','etc')
OR vend_state IS NULL;

아니면 사용ISNULL()

SELECT * 
FROM vendors
WHERE ISNULL(vend_state,'XX') IN ('XX','MI');

비교할 수 없습니다.NULL이쪽입니다.명시적이고 별도의 비교를 수행해야 합니다.

SELECT * 
FROM vendors
WHERE vend_state IS NULL OR vend_state = 'MI';

언급URL : https://stackoverflow.com/questions/44010663/sql-mariadb-null-value-is-ignored

반응형