如果列存在,如何选择特定行,如果列不存在,如何选择所有行

Mat*_* S. 24 mysql count select

我正在编写一个脚本来获取几个表的行数,但是对于某些表,我只想获取设置了标志的行数(在这种情况下为 active=1)。有没有一种方法可以在一个查询中做到这一点?

例如:

users有一个名为 active 的列

clients没有名为 active 的列

我想获取 active=1 的用户数,并获取客户端数。

在你说“只是硬编码它”之前,这是一个在 python 脚本中的查询,该脚本可以在许多不同的数据库上运行,我无法知道我的脚本将选择哪些表,以及它们是否有一个名为 的列active,以及我宁愿只用一个查询来完成所有工作,而不是两个单独的查询并依靠 mysql 抛出错误,所以我知道使用另一个查询。

ype*_*eᵀᴹ 53

我的第一个想法是使用第INFORMATION_SCHEMA一个,这样您就可以知道(在对 MySQL 实例中所有表的一个查询中)哪些表有一个active列,然后使用该信息来构建您的查询。这可能是最明智的方法。

还有另一种棘手的方法,不管表是否有这样的列都可以工作:

SELECT 
  ( SELECT COUNT(*)
    FROM TableName AS t
    WHERE active = 1
  ) AS cnt
FROM
  ( SELECT 1 AS active
  ) AS dummy ;
Run Code Online (Sandbox Code Playgroud)

SQL-Fiddle测试它是如何工作的?

如果表中有一个名为 的列active,则查询被“翻译”为:

    WHERE t.active = 1
Run Code Online (Sandbox Code Playgroud)

如果表中没有名为 的列active,则查询将被“翻译”为:

    WHERE dummy.active = 1         -- which is true 
Run Code Online (Sandbox Code Playgroud)