2011-09-12 29 views
9

En un script sql que realiza la ejecución secuencial, ¿hay alguna manera de introducir un IF THEN ELSE condicional para controlar el flujo de ejecución de la consulta?Si es condicional en SQL Script para Mysql

Me encontré con este http://www.bennadel.com/blog/1340-MySQL-Does-Not-Support-IF-ELSE-Statements-In-General-SQL-Work-Flow.htm que dice que IF THEN ELSE no funcionará en un script sql.

¿Hay otra forma de hacerlo?

Básicamente, deseo ejecutar un comando particular "select colName from table" y comprobar si colName corresponde a un valor particular. Si lo hace, continúe con el resto del script. De lo contrario, detenga la ejecución.

Por favor, asesorar.

+0

Desde el enlace proporcionado: "Solo se permiten en funciones y procedimientos almacenados". – user470714

+0

Puede poner su script en un procedimiento almacenado y luego simplemente invocar el procedimiento. – Owen

+0

¿Qué tal unión? – ajreal

Respuesta

16

Acabo de ajustar mi script SQL en un procedimiento, donde se permite el código condicional. Si prefiere no dejar las declaraciones por ahí, puede abandonar el procedimiento cuando haya terminado. Aquí hay un ejemplo:

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; 

Si no ha utilizado los procedimientos, la palabra clave "delimitador" podría necesitar alguna explicación. La primera línea cambia el delimitador a "//" para que podamos incluir puntos y comas en nuestra definición de procedimiento sin que MySQL intente interpretarlos todavía. Una vez que se ha creado el procedimiento, cambiamos el delimitador a ";" para que podamos ejecutar declaraciones como de costumbre.

0

Después de investigar un poco, creo que he encontrado una forma de evitar esto. Estaba buscando una manera de verificar si un script ya se había ejecutado en una base de datos de destino. Esto será principalmente para el control de versiones de mis bases de datos. Tengo una tabla creada para hacer un seguimiento de las secuencias de comandos que se han ejecutado y quería un poco de flujo dentro de mis scripts para verificar esa tabla antes de la ejecución. Si bien no he resuelto por completo el problema, he creado un script simple que básicamente hace lo que necesito, solo tengo que ajustar el DDL en las selecciones en función del valor de las variables.

paso 1 - Configuración de una variable de bits para mantener el resultado paso 2 - SUS seleccionar y ajustar la variable si no se encuentra el resultado el paso 3 - Haz lo que tiene que hacer el resultado falso paso 4 - Haz lo que tiene que hacer el verdadero resultado

Aquí está el script de ejemplo

conjunto @schemachangeid = 0;

select @schemachangeid: = 1 de SchemaChangeLog donde scriptname = '1_create_tables.sql';

seleccione 'scriptalreadyran' desde dual donde @schemachangeid = 1;

seleccione 'scriptnotran' desde dual donde @schemachangeid = 0;

También reconozco que este es un hilo viejo, pero tal vez esto ayude a alguien por ahí tratando de hacer este tipo de cosas fuera de un procedimiento almacenado como yo.