【问题标题】:MySQL - Ignore query if table not existMySQL - 如果表不存在则忽略查询
【发布时间】:2014-06-10 10:34:37
【问题描述】:

我有一个名为tableA 的表,它在某些数据库中可能不存在。当数据库中不存在此 tableA 时,我希望忽略 select 查询语句。

我已尝试从信息架构中选择计数,但 if-else 语句之一仍然具有 select * from tableA,这仍然会给我一个错误。

    SELECT IF( 
   (SELECT COUNT(*) FROM information_schema.TABLES 
   WHERE TABLE_NAME = 'tableA')>0,
   (SELECT COUNT(*) FROM tableA),
   (SELECT COUNT(*) FROM tableB) )

而且我还需要 true-false 的 select 语句来返回超过 1 列,但是当我尝试这样做时,它会给我一个超过 1 个操作数的错误。如何使查询在此 IF 查询中返回多于 1 列。

【问题讨论】:

  • 是的,你不能那样做。可能需要重新设计。
  • 你为什么要这个?看起来很奇怪。
  • 因为报表在其他客户端使用时,有些客户端没有表..所以需要调入查询以支持全部

标签: mysql


【解决方案1】:

我必须同意你的要求似乎很奇怪。无论如何,您的查询不起作用,因为 MySQL(我也打赌所有其他 DBMS)首先评估查询以检查语法错误等等......以及现有表。

您可以在应用程序代码中进行多次查询,也可以创建一个存储过程来使用预准备语句获取数据。代码如下所示:

DELIMITER $$
CREATE PROCEDURE get_my_data()
BEGIN
SET @table_name = '';
IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE SCHEMA_NAME = 'your_db_name' 
           AND TABLE_NAME = 'your_table_name')
THEN SET @table_name = 'tableA';
ELSE SET @table_name = 'tableB';
END IF;

SET @sql = CONCAT('SELECT COUNT(*) FROM ', @table_name, ';');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

END $$
DELIMITER ;

创建后,您将执行该过程

CALL get_my_data();

【讨论】:

  • @user3551839 反馈会很好。
  • 感谢您的解决方案 :) 但是他们更改了框架,该框架将在实际接受查询之前检查表是否存在。因此,不再需要仅查询自身。不过谢谢:)
  • 无论如何,欢迎接受我的回答,让其他人知道问题已解决。
  • SCHEMA_NAME 是 INFORMATION_SCHEMA 中的表,您应该使用 INFORMATION_SCHEMA.TABLE 中的 TABLE_SCHEMA
  • @TejpalSharma 你的句子没有意义。没有表 schema_name,你建议我已经做了,你只是混淆了一些名称。
猜你喜欢
  • 2017-02-15
  • 1970-01-01
  • 1970-01-01
  • 2012-06-09
  • 2019-07-02
  • 2014-03-08
  • 1970-01-01
  • 2012-08-19
  • 2012-03-28
相关资源
最近更新 更多