2014-07-09 3 views
0

MySQL 테이블을 분석하고 그 테이블의 모든 레코드에 NULL, 0 또는 빈 문자열을 포함하지 않는 모든 을 확인해야합니다. MySQL이 문장의 시작 부분에서 열을 선택하기를 기대하기 때문에이를 수행하는 방법에 대한 단서가 없습니다. 나는 어쩌면모든 레코드에서 null이 아닌 열을 선택하십시오.

SELECT column_header FROM rotated_table WHERE record_1 <> NULL AND record_2 <> NULL AND [...]

그러나 이것은 많은 작업이 될 것 같은 일을 90 °로 테이블을 회전 수 있다고 생각. 필요한 정보를 얻는 쉬운 방법이 있습니까?

업데이트 예를 :

표 : 열 우편NULL 값이 포함되어 있기 때문에

name  street 
MyName  1st Ave. 
OtherName 2nd Street 

:

name  street  zip 
MyName  1st Ave. 1000 
OtherName 2nd Street NULL 

내 문은 지금과 같이 표시되어야합니다. 추가 행이

name  street  zip 
MyName  1st Ave. 1000 
OtherName 2nd Street NULL 
NULL  Foo blvd. 3453 

같이 있었다면 그것은

street 
1st Ave. 
2nd Street 
Foo blvd. 

때문에 이름우편 적어도 하나의 NULL 값을 포함 반환해야합니다.

답변

0

COUNT의 동작을 사용하면 NULL 값을 무시할 수 있습니다.

행 수 계산에서 검사중인 열 수를 뺍니다. 0 값을 반환하는 열은 NULL 값을 포함하지 않습니다. 고려해야 할 값을 "공백"으로 변환하려면 CASE 문을 사용하여 NULL으로 변환해야합니다.

이 방법을 사용하면 테이블을 "회전"시키기 위해 전체 테이블을 복사 할 필요가 없습니다.

나는 당신을 위해 작동 할 here in SQLFiddle 예를 채웠다.

CREATE TABLE address 
(
    address int auto_increment primary key, 
    street1 varchar(20), 
    street2 varchar(20), 
    city varchar(20), 
    state varchar(20), 
    zip int, 
    comment varchar(20) 
); 

INSERT INTO address 
(street1, street2, city, state, zip, comment) 
VALUES 
('123 Main St.', null, 'Cleveland', 'OH', 44123, ''), 
('1313 Mockingbird Ln.', null, 'Cleveland', 'OH', 0, 'Unknown zip'), 
('321 Main St.', 'Apt #1', 'Cleveland', 'OH', 44123, ''), 
('321 Main St.', 'Apt #2', 'Cleveland', 'OH', 44123, ''); 

SELECT 
COUNT(*) rows, -- not really needed, you can remove this 
COUNT(*) - COUNT(CASE ad.street1 WHEN '' THEN NULL ELSE ad.street1 END) empty_street1, 
COUNT(*) - COUNT(CASE ad.street2 WHEN '' THEN NULL ELSE ad.street2 END) empty_street2, 
COUNT(*) - COUNT(CASE ad.city WHEN '' THEN NULL ELSE ad.city END) empty_city, 
COUNT(*) - COUNT(CASE ad.state WHEN '' THEN NULL ELSE ad.state END) empty_state, 
-- Change the value being compared based on the column type. Strings '', numbers 0, etc. 
COUNT(*) - COUNT(CASE ad.zip WHEN 0 THEN NULL ELSE ad.zip END) empty_zip, 
COUNT(*) - COUNT(CASE ad.comment WHEN '' THEN NULL ELSE ad.comment END) empty_comment 
FROM address ad; 

결과 :

가 여기에 링크를 사용할 수 없게 될 경우 my SQLFiddle example의 내용이다

ROWS EMPTY_STREET1 EMPTY_STREET2 EMPTY_CITY EMPTY_STATE  EMPTY_ZIP EMPTY_COMMENT 
4  0    2    0   0    1   3 
+0

Bah - 어떻게 든 '0'과 빈 문자열 요구 사항을 놓쳤습니다. 나는 곧 개정 할 것이다. –

+0

자, 가세요.이 질문은 당신이 요구 한대로해야한다고 생각합니다. –

+0

항상 모든 레코드를 계산하기 때문에 [count (*)] (http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_count)를 사용하십시오. –

0

NULL과의 정확한 비교는 IS NULL 또는 IS NOT NULL입니다. 따라서 :

SELECT column_header 
FROM rotated_table 
WHERE record_1 IS NOT NULL AND record_2 IS NOT NULL AND [...]; 

그러나 "레코드"는 열에 이상한 이름입니다. 열 이름이 WHERE 절에 있는지 확인하려고합니다.

+0

죄송합니다, 나는 완전히 질문에 행과 열을 혼합. 정말로 어떤 행에서도 null이 아닌 _columns_ 만 선택하는 것입니다. –

+0

@ 리차드 노이만. . . 이 질문을 삭제하고 다른 질문을하는 것이 좋습니다. 샘플 데이터와 원하는 결과를 포함하십시오. –

관련 문제