2014-06-10 63 views
1

我有這張表tableA它可能不存在於某些數據庫。當這個tableA不存在於數據庫中時,我希望select查詢語句被忽略。MySQL - 忽略查詢如果表不存在

我試圖從信息模式中選擇計數,但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語句返回我1個多列,但是當我試過了,它會給我多1個操作數的錯誤。如何使查詢在此IF查詢中返回多於1列。

+0

執行過程呀,你不能這樣做。可能需要重新設計。 – Strawberry

+0

你爲什麼要這個?這似乎很奇怪。 –

+0

因爲當報告在其他客戶端使用時,某些客戶端沒有該表..所以需要調整查詢以便可以支持所有的 – user3551839

回答

3

我必須同意你的要求看起來很奇怪。無論如何,你的查詢不起作用,因爲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 ; 

一旦建立,那麼你會用

+0

@ user3551839反饋會很好。 – fancyPants

+0

感謝您的解決方案:)但他們改變了框架,它將在實際接受查詢之前檢查表是否存在。所以,不需要在查詢本身中進行。謝謝雖然:) – user3551839

+0

無論如何,請隨時接受我的答案,以便其他人知道問題已解決。 – fancyPants