MySQL SELECT 만 null 값이 아님


264

NOT NULL 값만 사용하는 select 문을 수행 할 수 있습니까?

지금 나는 이것을 사용하고 있습니다 :

SELECT * FROM table

그런 다음 PHP 루프로 null 값을 필터링해야합니다.

할 수있는 방법이 있습니까?

SELECT * (that are NOT NULL) FROM table

?

지금 선택하면 * val1, val2, val3, null, val4, val5, null, null 등이 발생하지만 결과에 null이 아닌 값을 얻고 싶습니다. 루프로 필터링하지 않고도 가능합니까?


2
일부 열에 NULL 값이 있고 다른 열에 NULL 값이없는 행이있는 경우 어떻게 하시겠습니까?
Mark Byers

null이 아닌 열에서만 값을 가져오고 null이 아닌 행의 열 값만 반환하고 싶습니다. 지금은 루프를 사용하여 걸러냅니다. 루프없이 할 수 있습니까?
bryan sammon

1
@bryan-테이블 구조는 무엇입니까? 모든 열에 동일한 데이터 유형이 있습니까?
Martin Smith

1
@bryan-그렇다면 이상적인 결과 세트는 무엇입니까? 널이 아닌 모든 값을 포함하는 하나의 열 결과 세트? 예제 데이터를 사용하여 질문을 편집하지 않으면 원하는 결과가 도움이 될 것입니다.
Martin Smith

2
@bryan-테이블에 열 그룹이 반복되어있는 것 같습니다. ( en.wikipedia.org/wiki/First_normal_form 인 경우 설명 및 제안 된 대체 구조에 대해서는 Wiki 기사를 참조하십시오. )
Martin Smith

답변:


452

을 사용해야합니다 IS NOT NULL. 비교 연산자 =<>둘 다 표현식의 양쪽에 제공 UNKNOWN됩니다 NULL.

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

완전성을 위해 MySQL에서는 null safe equality operator를 무시할 수 있지만 이것은 표준 SQL이 아니라고 언급합니다 .

SELECT *
FROM table 
WHERE NOT (YourColumn <=> NULL);

댓글을 반영하도록 수정되었습니다. 테이블이 첫 번째 정상적인 형태가 아닌 것처럼 들리므로 구조를 변경하면 작업이 쉬워집니다. 그래도 몇 가지 다른 방법으로 ...

SELECT val1 AS val
FROM  your_table
WHERE val1 IS NOT NULL
UNION ALL
SELECT val2 
FROM  your_table
WHERE val2 IS NOT NULL
/*And so on for all your columns*/

위의 단점은 각 열에 대해 테이블을 여러 번 스캔한다는 것입니다. 아마 아래에서 피할 수는 있지만 MySQL에서는 이것을 테스트하지 않았습니다.

SELECT CASE idx
         WHEN 1 THEN val1
         WHEN 2 THEN val2
       END AS val
FROM   your_table
        /*CROSS JOIN*/
       JOIN (SELECT 1 AS idx
                   UNION ALL
                   SELECT 2) t
HAVING val IS NOT NULL  /*Can reference alias in Having in MySQL*/

2
고마워 .. 도움이 :)
DfrDkn

마지막 접근 방식에서는 함수가 CASE아니라 명령문 을 사용했습니다 CASE. 그래서는 안 END CASE대신 ENDSELECT CASE ...부분?
Istiaque Ahmed

전문가가 아닌 사람들을 위해 마지막 해결책을 설명해 주시겠습니까? 않습니다 idx 롬 첫 번째 SELECT으로부터 온 idx두 번째에 SELECT? 그 CASE진술 은 무엇 을 이루려고 노력합니까? 두 번째는 SELECT실제로 무엇을합니까? 그리고 당신은 교차 조인이 아닌 내부 조인을하고 있습니까?
Istiaque Ahmed

나는 이것이 질문에 대답하지 않는다고 생각한다. OP가 (단 하나의 특정) 행을 선택하려고하지만 null 인 결과에서 모든 열을 제외하려는 것처럼 들렸습니다.이 대답은 null이 허용되지 않는 열을 지정해야합니다 (전적으로 다른 문제임). 많은 열이있는 테이블의 경우, 적합하지 않은 모든 열을 지정
csey

(예 : 라인을 따라 뭔가 SELECT * FROM table WHERE * IS NOT NULL AND primary_key="somevalue")
csey

18

특정 열에 NULL 값이 포함 된 행을 필터링 할 수 있습니다.

SELECT col1, col2, ..., coln
FROM yourtable
WHERE somecolumn IS NOT NULL

열에 널이 포함 된 행을 필터링하려면 다음을 시도하십시오.

SELECT col1, col2, ..., coln
FROM yourtable
WHERE col1 IS NOT NULL
AND col2 IS NOT NULL
-- ...
AND coln IS NOT NULL

업데이트 : 귀하의 의견에 따라, 아마도 이것을 원하십니까?

SELECT * FROM
(
    SELECT col1 AS col FROM yourtable
    UNION
    SELECT col2 AS col FROM yourtable
    UNION
    -- ...
    UNION
    SELECT coln AS col FROM yourtable
) T1
WHERE col IS NOT NULL

그리고 Martin과 동의를 취해야 할 경우 데이터베이스 디자인을 변경해야 할 것입니다.


내가 충분히 설명했는지 확실하지 않지만 조금 더 잘하려고합니다. 지금 선택하면 * val1, val2, val3, null, val4, val5, null, null 등이 발생하지만 결과에 null이 아닌 값을 얻고 싶습니다. 루프로 필터링하지 않고도 가능합니까?
bryan sammon

@bryan-어떤 열이 *반환 되는지 설명 할 수 있습니까? 아마도 이것이 하나의 열인지 여부에 대한 위의 의견에서 명확하지 않기 때문에 질문에 약간의 예제 데이터를 제공하십시오.
Martin Smith

현재 *는 행의 모든 ​​값을 반환합니다. 즉, val1, val2, val3, null, val4, val5, null, null입니다. 그러나 null이 아닌 열 값만 반환하기를 원합니다. 지금은 루프를 사용하여 결과를 반환 한 후 값을 필터링합니다.
bryan sammon

13
Select * from your_table 
WHERE col1 and col2 and col3 and col4 and col5 IS NOT NULL;

이 방법의 유일한 단점은 5 열만 비교할 수 있다는 것입니다. 그 후에는 결과가 항상 거짓이 될 수 있으므로 가능한 필드 만 비교합니다 NULL.


8

이 솔루션을 찾았습니다.

이 쿼리는 각 열에 대해 마지막이 null이 아닌 값을 선택합니다.


테이블이있는 경우 :

id|title|body
1 |t1   |b1
2 |NULL |b2
3 |t3   |NULL

당신은 얻는다 :

title|body
t3   |b2

질문


SELECT DISTINCT (

  SELECT title
  FROM test
  WHERE title IS NOT NULL 
  ORDER BY id DESC 
  LIMIT 1
) title, (

  SELECT body
  FROM test
  WHERE body IS NOT NULL 
  ORDER BY id DESC 
  LIMIT 1
) body
FROM test

도와 드리겠습니다.


GROUP_CONCAT (body) AS body
Ravindra Singh

2

\!MySQL 에서 명령을 사용하여 셸에서 NULL 값을 grep합니다.

\! mysql -e "SELECT * FROM table WHERE column = 123456\G" | grep -v NULL

.my.cnf데이터베이스 / 사용자 이름 / 암호가 지정된 적절한 위치에서 가장 잘 작동 합니다. 그런 식으로 당신은 당신을 둘러싸고있는 select\! mysql e| grep -v NULL.


1

나를 위해 일하는 다음 쿼리

'NULL'열의 기본값을 설정하면

select * from table where column IS NOT NULL

내가 기본값을 설정하면 아무것도

select * from table where column <>''


0

MYSQL은 JOIN 및 SELECT, NULL과 같은 삽입 및 삭제 및 논리 연산자가 아닌 NULL이 아닙니다.

Using IS NOT NULL On Join Conditions

 SELECT * FROM users 
 LEFT JOIN posts ON post.user_id = users.id 
 WHERE user_id IS NOT NULL;

 Using IS NOT NULL With AND Logical Operator

 SELECT * FROM users 
 WHERE email_address IS NOT NULL 
 AND mobile_number IS NOT NULL;

Using IS NOT NULL With OR Logical Operator

 SELECT * FROM users 
 WHERE email_address IS NOT NULL 
 OR mobile_number IS NOT NULL;

-4
SELECT * FROM TABLE_NAME
where COLUMN_NAME <> '';

2
비어있는 것을 선택하지 않습니다. 질문은 null 값을 선택하지 않는 것입니다
krishna
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.