选择任何记录中不为空的列

时间:2014-07-09 15:35:07

标签: mysql sql select dynamic-columns

我需要分析一个MySQL表,并希望确定所有从不包含NULL,0或该表中任何记录中的空字符串。 我不知道如何做到这一点,因为MySQL希望我在语句的开头选择列。我想我可以将桌子旋转90°,然后做一些像

这样的事情

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

但这似乎是很多工作。 有没有更简单的方法来获取我需要的信息?

更新示例

表1:

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

我的陈述现在应该显示如下:

name        street
MyName      1st Ave.
OtherName   2nd Street

因为列 zip 包含NULL值。 如果有一个额外的行,如

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

它应该返回

street
1st Ave.
2nd Street
Foo blvd.

因为名称 zip 至少包含一个NULL值。

2 个答案:

答案 0 :(得分:0)

NULL的正确比较为IS NULLIS NOT NULL。所以:

SELECT column_header
FROM rotated_table
WHERE record_1 IS NOT NULL AND record_2 IS NOT NULL AND [...];
然而,&#34;记录&#34;列是奇怪的名字。您希望确保列名称在WHERE子句中。

答案 1 :(得分:0)

您可以使用COUNT忽略NULL值的行为。

从行数计算中减去您要检查的列的计数。返回值0的任何列都不包含NULL值。您需要使用CASE语句转换您认为是&#34;空的&#34;进入NULL

这种方法也消除了复制整个表格的需要,以便&#34;旋转&#34;它

我发了一个适合你的例子here in SQLFiddle

如果链接无法使用,请my SQLFiddle example的内容:

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;

结果是:

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