【问题标题】:Find rows with Empty columns without mentioning column name查找具有空列而不提及列名的行
【发布时间】:2015-05-01 04:26:22
【问题描述】:

我想从我的数据库表中查找具有空列的行。
假设我的表有 10 列和 100 行,这 10 列中的任何一个都可能是 NULL/EMPTY。

所以我不能使用 WHERE 命令

例如:

SELECT * FROM CUSTOMER WHERE REVENUE IS NULL OR ID IS NULL OR INCOME IS NULL   ....(this goes on till 10 columns)

如何编写此查询来选择具有空/空值的行(在任何列中)。

【问题讨论】:

  • 你可以使用where命令
  • 你能详细说明一下吗,帕拉。如果您有多个(可能是 10 或 15)列并且不知道哪一列具有空值,则使用 where 命令。您必须使用 where 命令提及所有列。例如:SELECT * FROM EMP WHERE c1 IS NULL OR C2 IS NULL OR C3 IS NULL OR C4 IS NULL OR ........ C15 IS NULL。这个过程很乏味。应该有更好的解决方案。对不起,我不知道答案。我被类似的东西困住了。
  • 您可以从 information_schema.columns 表中构造一个准备好的语句,然后执行该准备好的语句。这有点混乱 - 在应用层构建查询可能更容易
  • 嘿,非常新的新手,您是否在任何编程语言(如 java 或 php 或其他任何编程语言)中使用此查询来执行此查询。或者只是使用 mysql 命令行完成任务。请具体说明。所以我可以帮助编程语言。
  • 这些类型的问题可能表明设计不佳,尽管在您的情况下,如果没有更多信息就不可能说出来

标签: mysql


【解决方案1】:

information_schema.columns 包含系统中每个数据库中每个表的列信息。我们可以从中提取您的表的列名,并使用它来构建一个准备好的语句,我们可以执行该语句来查找您的值。

假设您的数据库名为foo,而您的表名为test,我们可以这样做:

select concat("SELECT * FROM test WHERE ", group_concat(concat(column_name, " IS NULL ") SEPARATOR "OR "))
  into @sql
  from information_schema.columns
    where table_name = 'test'
      and table_schema = 'foo';

这将生成并存储在@sql 中,查询如下所示:

SELECT * 
  FROM test 
    WHERE id IS NULL 
      OR col1 IS NULL 
      OR col2 IS NULL 
      OR col3 IS NULL 
      OR col4 IS NULL 
      OR col5 IS NULL

然后我们像这样准备我们的声明:

prepare stmt from @sql

然后我们执行它以获取您的值

execute stmt

最后,我们解除分配语句。

deallocate prepare stmt;

这将是该序列的示例输出:

mysql> select * from test;
+----+------+------+------+------+------+
| id | col1 | col2 | col3 | col4 | col5 |
+----+------+------+------+------+------+
|  1 |    1 |    2 |    3 |    4 |    5 |
|  2 |    1 |    2 |    3 |    4 |    5 |
|  3 |    1 |    2 |    3 |    4 |    5 |
|  4 |    1 |    2 |    3 |    4 | NULL |
|  5 | NULL |    2 |    3 |    4 |    5 |
|  6 |    1 | NULL |    3 |    4 |    5 |
+----+------+------+------+------+------+
6 rows in set (0.00 sec)

mysql> select concat("SELECT * FROM test WHERE ", group_concat(concat(column_name, " IS NULL ") SEPARATOR "OR "))
    ->   into @sql
    ->   from information_schema.columns
    ->     where table_name = 'test'
    ->       and table_schema = 'foo';
Query OK, 1 row affected (0.01 sec)

mysql> prepare stmt from @sql;
Query OK, 0 rows affected (0.00 sec)
Statement prepared

mysql> execute stmt;
+----+------+------+------+------+------+
| id | col1 | col2 | col3 | col4 | col5 |
+----+------+------+------+------+------+
|  4 |    1 |    2 |    3 |    4 | NULL |
|  5 | NULL |    2 |    3 |    4 |    5 |
|  6 |    1 | NULL |    3 |    4 |    5 |
+----+------+------+------+------+------+
3 rows in set (0.00 sec)

mysql> deallocate prepare stmt;
Query OK, 0 rows affected (0.00 sec)

【讨论】:

  • 好一个帕拉!谢谢。
  • @AlekhyaVemavarapu 没问题 - 如果这对您来说是一个合适的答案,您能否将其标记为已接受
  • 这不是我的问题,否则我会问的。
  • @AlekhyaVemavarapu 哈哈。哎呀。不习惯被别人评论:D
【解决方案2】:

是的,您可以这样做,但您需要使用 PL/SQL。你没事吧???

【讨论】:

  • 是的,应该没问题。如果能通过程序解决就好了。你能帮我吗?非常感谢!
  • 是的,我找到了一个类似的解决方案,下面是相同的链接:stackoverflow.com/questions/13737725/…
猜你喜欢
  • 2014-12-15
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
  • 2012-05-12
  • 1970-01-01
相关资源
最近更新 更多