Если условно в SQL Script для Mysql - PullRequest
12 голосов
/ 12 сентября 2011

В сценарии sql, который выполняет последовательное выполнение, есть ли способ ввести условие IF THEN ELSE для управления потоком выполнения запроса?

Я случайно столкнулся с этим http://www.bennadel.com/blog/1340-MySQL-Does-Not-Support-IF-ELSE-Statements-In-General-SQL-Work-Flow.htm в котором говорится, что ЕСЛИ ДРУГОЕ не будет работать в сценарии SQL.

Есть ли другой путь?

По сути, я хочу запустить определенную команду «выбрать имя столбца из таблицы» и проверить, соответствует ли имя столбца определенному значению. Если это произойдет, перейдите к остальной части сценария. Остальное, остановка казни.

Пожалуйста, сообщите.

Ответы [ 2 ]

22 голосов
/ 24 сентября 2011

Я просто оборачиваю свой сценарий SQL в процедуру, где разрешен условный код. Если вы не хотите оставлять заявления без дела, вы можете отказаться от процедуры, когда закончите. Вот пример:

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;

Если вы не использовали процедуры, ключевое слово «delimiter» может нуждаться в пояснении. Первая строка переключает разделитель на «//», так что мы можем включить точки с запятой в наше определение процедуры, пока MySQL не пытается их интерпретировать. После того, как процедура была создана, мы переключаем разделитель обратно на «;» поэтому мы можем выполнять операторы как обычно.

1 голос
/ 21 октября 2014

После некоторого исследования я думаю, что, возможно, нашел способ обойти это. Я искал способ проверить, выполнялся ли уже сценарий для целевой базы данных. Это будет в первую очередь для контроля версий моих баз данных. У меня есть таблица, созданная для отслеживания выполненных сценариев, и я хотел, чтобы поток внутри моих сценариев проверил эту таблицу перед выполнением. Хотя я еще не полностью решил проблему, я создал простой скрипт, который в основном делает то, что мне нужно, но мне просто нужно обернуть DDL в выборки, основываясь на значении переменных.

шаг 1 - установка битовой переменной для хранения результата шаг 2 - выберите и установите переменную, если результат найден Шаг 3 - Делайте то, что вам нужно сделать на ложный результат Шаг 4 - Делайте то, что вам нужно, чтобы получить истинный результат

Вот пример сценария

set @schemachangeid = 0;

выберите @schemachangeid: = 1 из SchemaChangeLog, где scriptname = '1_create_tables.sql';

выберите 'scriptalreadyran' из двойного, где @schemachangeid = 1;

выберите 'scriptnotran' из двойного, где @schemachangeid = 0;

Я также признаю, что это старая ветка, но, возможно, это поможет кому-то там попытаться сделать что-то подобное вне хранимой процедуры, такой как я.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...