MySQL - игнорировать запрос, если таблица не существует

У меня есть таблица tableA где она может отсутствовать в некоторых базах данных. Я хочу, чтобы запрос запроса select игнорировался, когда эта tableA не существует в базах данных.

Я попытался выбрать счет из информационной схемы, но один из операторов 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) )

А также мне нужен оператор select true-false, чтобы вернуть мне более одного столбца, но когда я попытался это сделать, он даст мне ошибку более чем из 1 операнда. Как doi делает запрос возвращать более 1 столбца в этом IF запросе.

1 ответ

Я должен согласиться с тем, что ваше требование кажется довольно странным. Во всяком случае, ваш запрос не работает, потому что MySQL (и я уверен, что все другие СУБД тоже) сначала оценивает запрос для проверки синтаксических ошибок и т.д.... и для существующих таблиц.

Либо вы просто делаете эти несколько запросов в коде приложения, либо создаете хранимую процедуру для получения данных с помощью подготовленных операторов. Код для этого выглядит примерно так:

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();

licensed under cc by-sa 3.0 with attribution.