MySQL : 열이 null 인 행 선택


270

특정 열에 대해 NULL이있는 행을 선택하려고하면 빈 세트가 반환되는 문제가 있습니다. 그러나 phpMyAdmin의 테이블을 볼 때 대부분의 행에 대해 null을 나타냅니다.

내 쿼리는 다음과 같습니다.

SELECT pid FROM planets WHERE userid = NULL

매번 빈 세트.

많은 곳에서 실제 값 대신 "NULL"또는 "null"로 저장되지 않았으며 공간 ( userid = ' ') 만 찾으려고 했지만 아무 것도 작동하지 않았습니다. MyISAM에 null을 저장하는 데 문제가 있으므로 MyISAM을 사용하지 않고 innoDB를 사용하라는 제안이있었습니다. 테이블을 innoDB로 전환했지만 이제는 변환 방법으로 인해 실제로 null이 아닌 문제가있을 수 있습니다. innoDB 또는 다른 것으로 테이블을 다시 만들지 않고이 작업을 수행하고 싶지만 필요한 경우 확실히 시도 할 수 있습니다.


1
MyISAM은 null을 저장하는 데 문제가 없습니다. NULL의 의미 자체는 엔진과 독립적이어야합니다.
MarkR

답변:


512

SQL NULL은 특별 WHERE field IS NULL하며 NULL은 아무것도 할 수 없으므로 수행해야합니다 .

자체 포함 (예 : NULL = NULL은 항상 false)

https://en.wikipedia.org/wiki/Codd%27s_12_rules를 참조 Rule 3 하십시오.


24
알 수 없음-거짓이 아닙니다. SQL은 세 가지 가치 논리를 사용합니다.
Martin Smith

38
NULL = NULL은 실제로 FALSE가 아닙니다. 다시 NULL입니다. 그러나 TRUE도 아니므로 IF (NULL = NULL)이 실행되지 않습니다.
Konerak

1
@obe 답변 참조 : SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL; -> 1, 1, 0
Thomas

null은 다른 것과 같지 않을뿐만 아니라 다른 것도 아닙니다. 즉, bar가 null 인 행 select * from foo where bar <> "abc"은 반환 하지 않습니다 . 그것은 오늘 루프를 던졌습니다. 문서 <>는 "같지 않음"연산자를 호출 하지만 실제로는 "다른 것 이외의"연산자입니다.
StackOverthrow 1


39

모두 답변을 얻었으므로 조금 더 추가하고 싶습니다. 나는 또한 같은 문제에 직면했다.

쿼리가 실패한 이유는 무엇입니까? 당신은,

SELECT pid FROM planets WHERE userid = NULL;

mysql doc 에서 예상 한 결과를 얻지 못합니다.

SQL 에서 NULL 값은 다른 값, 심지어 NULL과 비교할 때 결코 참이 아닙니다. NULL을 포함하는 표현식은 표현식에 포함 된 연산자 및 함수에 대한 문서에 별도로 명시되지 않는 한 항상 NULL 값을 생성합니다.

강조합니다.

인 열 값을 검색하기 위해 테스트를 NULL사용할 수 없습니다 expr = NULL. 다음 명령문은 표현식에 대해 true가 아니므로 행을 리턴하지 않습니다.expr = NULL

해결책

SELECT pid FROM planets WHERE userid IS NULL; 

를 테스트하려면 및 연산자를 NULL사용하십시오 .IS NULLIS NOT NULL



11

http://w3schools.com/sql/sql_null_values.asp의 정보 :

1) NULL 값은 알 수없는 데이터가 없음을 나타냅니다.

2) 기본적으로 테이블 열은 NULL 값을 보유 할 수 있습니다.

3) NULL 값은 다른 값과 다르게 취급됩니다

4) NULL과 0을 비교할 수 없습니다. 그것들은 동등하지 않습니다.

5) =, <또는 <>와 같은 비교 연산자로 NULL 값을 테스트 할 수 없습니다.

6) 대신 IS NULL 및 IS NOT NULL 연산자를 사용해야합니다.

따라서 문제가 발생한 경우 :

SELECT pid FROM planets WHERE userid IS NULL

7

쿼리에서 동일한 문제가 발생했습니다.

SELECT * FROM 'column' WHERE 'column' IS NULL; 

값을 반환하지 않았습니다. MyISAM에 문제가있는 것으로 보이며 InnoDB의 데이터에 대한 동일한 쿼리가 예상 결과를 반환했습니다.

갔다 :

SELECT * FROM 'column' WHERE 'column' = ' '; 

모든 예상 결과를 반환했습니다.



0

데이터베이스를 Access에서 MySQL로 변환 할 때 (vb.net을 사용하여 데이터베이스와 통신) 동일한 문제가 발생했습니다.

필드 (필드 유형 varchar (1))가 null인지 평가해야했습니다.

이 진술은 내 시나리오에서 효과적이었습니다.

SELECT * FROM [table name] WHERE [field name] = ''

1
그것이 효과가 있다면 varchar (1)의 기본값은 null이 아닌 ''이므로이 질문과 관련이 없습니다.
さ り げ な い 告白
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.