0

我需要分析一个 MySQL 表,并希望确定该表中任何记录中从不包含、 0 或空字符串的所有列。NULL我不知道该怎么做,因为 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.

因为namezip至少包含一个NULL值。

4

2 回答 2

0

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

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

然而,“记录”对于列来说是一个奇怪的名称。您要确保列名在WHERE子句中。

于 2014-07-09T15:36:17.993 回答
0

您可以利用COUNT忽略NULL值的行为来发挥自己的优势。

从行数中减去您正在检查的列数。任何返回值的列0都不包含NULL值。您需要使用CASE语句将您认为“空”的任何值转换为NULL.

这种方法还消除了复制整个表以“旋转”它的需要。

在 SQLFiddle 中创建了一个示例,它应该对您有用。

这是我的 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;

结果是:

ROWS    EMPTY_STREET1   EMPTY_STREET2   EMPTY_CITY  EMPTY_STATE     EMPTY_ZIP   EMPTY_COMMENT
4       0               2               0           0               1           3
于 2014-07-09T19:11:57.097 回答