2011-09-12 15 views
9

In uno script sql che esegue l'esecuzione sequenziale, esiste un modo per introdurre un condizionale IF THEN ELSE per controllare il flusso dell'esecuzione della query?Se condizionale in SQL Script per Mysql

Mi è capitato di imbattersi in questo http://www.bennadel.com/blog/1340-MySQL-Does-Not-Support-IF-ELSE-Statements-In-General-SQL-Work-Flow.htm che dice che IF THEN ELSE non funzionerà in uno script sql.

C'è un altro modo per aggirare?

Fondamentalmente, voglio eseguire un particolare comando "select colName from table" e controllare se colName corrisponde a un valore particolare. Se lo fa, procedi con il resto dello script. Altrimenti, interrompi l'esecuzione.

Si prega di avvisare.

+0

Dal collegamento fornito: "Sono consentiti solo in funzioni e stored procedure." – user470714

+0

È possibile inserire lo script in una stored procedure e quindi semplicemente richiamare la procedura. – Owen

+0

Che ne dici dell'unione? – ajreal

risposta

16

Ho appena avvolto il mio script SQL in una procedura, dove è consentito il codice condizionale. Se preferisci non lasciare le dichiarazioni in giro, puoi abbandonare la procedura quando hai finito. Ecco un esempio:

delimiter // 

create procedure insert_games() 

begin 

    set @platform_id := (select id from platform where name = 'Nintendo DS'); 

    -- Only insert rows if the platform was found 
    if @platform_id is not null then 

     insert into game(name, platform_id) values('New Super Mario Bros', @platform_id); 
     insert into game(name, platform_id) values('Mario Kart DS', @platform_id); 

    end if; 

end; 

// 

delimiter ; 

-- Execute the procedure 
call insert_games(); 

-- Drop the procedure 
drop procedure insert_games; 

Se non si sono utilizzate le procedure, la parola chiave "delimitatore" potrebbe richiedere alcune spiegazioni. La prima riga cambia il delimitatore in "//" in modo che possiamo includere i semi-colon nella nostra definizione di procedura senza che MySQL tenti di interpretarli ancora. Una volta che la procedura è stata creata, riportiamo il delimitatore su ";" così possiamo eseguire le dichiarazioni come al solito.

0

Dopo aver fatto qualche ricerca, penso di aver trovato un modo per aggirare questo problema. Stavo cercando un modo per verificare se uno script fosse già stato eseguito su un database di destinazione. Questo sarà principalmente per il controllo della versione dei miei database. Ho creato una tabella per tenere traccia degli script che sono stati eseguiti e volevo del flusso all'interno dei miei script per controllare quella tabella prima dell'esecuzione. Anche se non ho ancora completamente risolto il problema, ho creato un semplice script che fondamentalmente fa ciò di cui ho bisogno, ho solo bisogno di avvolgere il DDL nei selects in base al valore delle variabili.

step 1 - Installazione un po 'variabile per contenere il risultato fase 2 - fare il vostro selezionare e impostare la variabile se il risultato viene trovato fase 3 - Fai quello che devi fare sul falso risultato fase 4 - Fare ciò che è necessario fare il vero risultato

Ecco lo script di esempio

set @schemachangeid = 0;

selezionare @schemachangeid: = 1 da SchemaChangeLog dove scriptname = '1_create_tables.sql';

selezionare 'scriptalreadyran' da dual dove @schemachangeid = 1;

selezionare 'scriptnotran' da dual dove @schemachangeid = 0;

Riconosco anche che questo è un thread precedente, ma forse questo aiuterà qualcuno là fuori a provare a fare questo genere di cose al di fuori di una stored procedure come me.