MySQL로 빈 필드 확인


100

특정 기준을 가진 사용자를 확인하는 쿼리를 작성했습니다. 하나는 이메일 주소가 있다는 것입니다.

우리 사이트는 사용자가 이메일 주소를 가질 수 있는지 여부를 허용합니다.

$aUsers=$this->readToArray('
 SELECT `userID` 
 FROM `users` 
 WHERE `userID` 
 IN(SELECT `userID`
         FROM `users_indvSettings`
  WHERE `indvSettingID`=5 AND `optionID`='.$time.')
  AND `email`!=""
 ');

이것이 SQL에서 빈 필드를 확인하는 가장 좋은 방법입니까? 방금 "IS NOT NULL"을 시도했지만 이메일 주소가없는 사용자 레코드가 반환되었습니다.

위의 쿼리는 작동하지만 호기심 때문에 올바른 방법으로 수행하고 있는지 궁금했습니다.

php  sql  mysql  null 

답변:


274

빈 필드는 빈 문자열 또는 NULL.

둘 다 처리하려면 다음을 사용하십시오.

email > ''

range테이블에 비어있는 이메일 레코드 (두 유형 모두)가 많은 경우 액세스의 이점을 누릴 수 있습니다 .


11
이것의 반대는 무엇입니까? (NULL 또는 ''필드 만 원하는 경우)
Keylan 2010 년

1
@Keylan : 단일 표현이 없습니다.
Quassnoi

5
@Keylan :! (email> '')
SEoF 2013

3
@SEoF : 일치하지 않습니다NULL
Quassnoi

2
Quassnoi와 같은 의견이 있습니다. 나는 "select orig_id, hotline from normal_1952 where! (hotline> '')"를 발행하고 null 핫라인이있는 레코드가 하나 있지만 일치하지 않습니다. MySQL 5.6을 사용하고 있습니다
Scott Chu

38

네, 당신이하는 일은 옳습니다. 이메일 필드가 빈 문자열이 아닌지 확인하고 있습니다. NULL은 데이터가 없음을 의미합니다. 빈 문자열 ""은 길이가 0 인 빈 문자열입니다.

null 검사도 추가 할 수 있습니다.

AND (email != "" OR email IS NOT NULL)

1
표현식은 빈 문자열과도 일치합니다. OR email IS NOT NULL여기서 중복됩니다 (이전 조건에 의해 암시 됨).
Quassnoi

1
흥미롭게도 이것은 여전히 ​​빈 email필드 가있는 레코드를 반환 합니다.

13
여기서 OR는 AND 여야합니다. "OR email IS NOT NULL"은 길이가 0 인 빈 이메일 문자열과 일치합니다.
pdavis

공지 사항 코멘트를 pdavis "OR이어야하며"
초보자

13

당신은 사용할 수 있습니다

IFNULL(email, '') > ''

2
큰! 그리고 TRIM이 필요하지 않습니다. 반전하려면 IFNULL (email, '') = ''를 사용하십시오.
mauromartini

2

빈 문자열 (email! = "")과 NULL 사이에는 차이가 있습니다. NULL은 null이고 빈 문자열은 무언가입니다.


AND (email! = ""OR email IS NOT NULL)가 실패하는 이유는 무엇입니까?

3
이어야합니다AND (email != '' AND email IS NOT NULL)
thetaiko 2010

@thetaiko : email IS NOT NULL여기서 중복됩니다. !=술어는 NULL값 과 일치하지 않습니다 .
Quassnoi

시도하는 경우 : AND (trim (email)! = '')
Leslie

나는이 토론에 다소 늦었다는 것을 알고 있지만, "AND ((email IS NOT NULL) AND (email! = ''))의 순서를 반대로하면 문장이 작동 할 것입니다. 다른 순서로 평가되는 경우 이메일 주소가 NULL이면 문은 null (TRUE 아님)로 평가되므로 TRUE 또는 FALSE가 아닙니다. 따라서 IS NULL 검사가 먼저 와야합니다!
Curt

2

이것은 작동하지만 여전히 널 레코드가 리턴 될 가능성이 있습니다. 레코드를 삽입 할 때 이메일 주소를 길이가 0 인 문자열로 설정할 수 있지만 어떻게 든 시스템에 들어오는 NULL 이메일 주소의 경우를 처리 할 수 ​​있습니다.

     $aUsers=$this->readToArray('
     SELECT `userID` 
     FROM `users` 
     WHERE `userID` 
     IN(SELECT `userID`
               FROM `users_indvSettings`
               WHERE `indvSettingID`=5 AND `optionID`='.$time.')
     AND `email` != "" AND `email` IS NOT NULL
     ');

@op의 쿼리는 NULL레코드가 반환 될 가능성을 남기지 않습니다 .
Quassnoi


-3

이 코드에서 문제를 확인하십시오.

$sql = "SELECT * FROM tablename WHERE condition";

$res = mysql_query($sql);

while ($row = mysql_fetch_assoc($res)) {

    foreach($row as $key => $field) {  

        echo "<br>";

        if(empty($row[$key])){

            echo $key." : empty field :"."<br>"; 

        }else{

        echo $key." =" . $field."<br>";     

        }
    }
}

쿼리에서이 일을 더 나은 방법은 모든 단일 행을 통해 루프를하지 않고있다
Jiho 강을
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.