2016-05-20 5 views
1
SELECT IF((
    SELECT COUNT(TABLE_NAME) 
    FROM information_schema.tables 
    WHERE TABLE_SCHEMA='database0' AND TABLE_NAME='table' 
) >0 , (
    SELECT id 
    FROM database1.table 
    WHERE id NOT IN (SELECT id FROM database0.table) 
), NULL) AS pk_value; 

Die Tabelle database0.table ist möglicherweise nicht vorhanden; Wenn die Tabelle nicht existiert, möchte ich die true-Klausel der IF-Anweisung überspringen. Auch wenn die IF-Anweisung NULL zurückgeben sollte, bekomme ich den Fehler, dass database0.table nicht existiert. Was kann ich tun, damit die Abfrage NULL zurückgibt, anstatt einen Fehler zu werfen, wenn die Tabelle nicht existiert?MySQL-Prüftabelle existiert mit IF-Funktion

+6

Die Abfrage als Ganzes kompiliert wird, bedeutet dies, das 'IF 'Funktion verhält sich nicht wie eine 'IF'-Anweisung in einer prozeduralen Sprache. Wenn die Tabelle nicht vorhanden ist, wird die Abfrage nicht erfolgreich kompiliert, egal was die IF-Funktion tut. –

Antwort

0

Wie in den Kommentaren erwähnt, werden Abfragen vor ihrer Ausführung auf Fehler überprüft, so dass der Verweis auf eine nicht vorhandene Tabelle nicht funktioniert. Sie speichern kann es als eine Funktion, die nur zur Laufzeit ausgewertet wird:

DROP FUNCTION IF EXISTS get_pk; 
DELIMITER // 

CREATE FUNCTION get_pk() 
RETURNS INT 

BEGIN 
    DECLARE counter INT; 
    DECLARE pk_value INT; 

    SELECT COUNT(table_name) INTO counter 
    FROM information_schema.tables 
    WHERE table_schema = 'database0' AND table_name = 'table'; 

    IF counter = 1 THEN 
     SELECT id INTO pk_value 
     FROM database1.table 
     WHERE id NOT IN (SELECT id FROM database0.table); 
    ELSE 
     SELECT NULL INTO pk_value; 
    END IF; 

    RETURN pk_value; 
END// 

DELIMITER ; 

dann den Wert wie folgt zugreifen:

SELECT get_pk(); 
Verwandte Themen