2011-09-12 38 views
9

Trong tập lệnh sql thực hiện tuần tự, có cách nào để giới thiệu IF THEN ELSE có điều kiện để kiểm soát luồng thực thi truy vấn không?Nếu có điều kiện trong SQL Script cho Mysql

Tôi tình cờ gặp phải điều này http://www.bennadel.com/blog/1340-MySQL-Does-Not-Support-IF-ELSE-Statements-In-General-SQL-Work-Flow.htm cho biết NẾU THÌ ELSE sẽ không hoạt động trong tập lệnh sql.

Có cách nào khác không?

Về cơ bản, tôi muốn chạy lệnh "select colName from table" cụ thể và kiểm tra xem colName có tương ứng với một giá trị cụ thể hay không. Nếu có, hãy tiếp tục với phần còn lại của tập lệnh. Khác, tạm dừng thực hiện.

Vui lòng thông báo.

+0

Từ liên kết được cung cấp: "Chúng chỉ được phép trong các chức năng và quy trình được lưu trữ". – user470714

+0

Bạn có thể đặt tập lệnh của mình vào một quy trình được lưu trữ và sau đó chỉ cần gọi thủ tục. – Owen

+0

Làm thế nào về công đoàn? – ajreal

Trả lời

16

Tôi chỉ bao bọc tập lệnh SQL của mình trong một quy trình, trong đó mã có điều kiện được cho phép. Nếu bạn không muốn để lại các câu nói dối nằm xung quanh, bạn có thể bỏ thủ tục khi bạn đã hoàn tất. Dưới đây là ví dụ:

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; 

Nếu bạn chưa sử dụng thủ tục, từ khóa "phân cách" có thể cần giải thích. Dòng đầu tiên chuyển dấu phân tách thành "//" để chúng ta có thể bao gồm dấu chấm phẩy trong định nghĩa quy trình của chúng tôi mà không có MySQL cố gắng giải thích chúng. Khi thủ tục đã được tạo, chúng tôi chuyển dấu phân tách trở lại thành ";" vì vậy chúng tôi có thể thực hiện các câu lệnh như bình thường.

0

Sau khi thực hiện một số nghiên cứu, tôi nghĩ rằng tôi có thể đã tìm ra cách để giải quyết vấn đề này. Tôi đã tìm kiếm một cách để xác minh xem một kịch bản đã được thực hiện đối với một cơ sở dữ liệu đích. Điều này sẽ chủ yếu để kiểm soát phiên bản cơ sở dữ liệu của tôi. Tôi có một bảng được tạo ra để theo dõi các kịch bản đã được thực hiện và muốn một số dòng chảy bên trong các kịch bản lệnh của tôi để kiểm tra bảng đó trước khi thực thi. Trong khi tôi chưa hoàn toàn giải quyết được vấn đề nhưng tôi đã tạo ra một kịch bản đơn giản về cơ bản thực hiện những gì tôi cần, tôi chỉ cần bọc DDL vào các lựa chọn dựa trên giá trị của các biến.

bước 1 - Thiết lập một biến chút để giữ được kết quả bước 2 - làm lựa chọn của bạn và thiết lập các biến nếu kết quả được tìm thấy bước 3 - Hãy làm những gì bạn cần làm vào kết quả sai bước 4 - Hãy làm những gì bạn cần phải làm trên kết quả đúng

Dưới đây là ví dụ kịch bản

bộ @schemachangeid = 0;

chọn @schemachangeid: = 1 từ SchemaChangeLog nơi scriptname = '1_create_tables.sql';

chọn 'scriptalreadyran' từ kép nơi @schemachangeid = 1;

chọn 'scriptnotran' từ kép nơi @schemachangeid = 0;

Tôi cũng nhận ra đây là một chủ đề cũ nhưng có lẽ điều này sẽ giúp một người nào đó đang cố gắng làm điều này ngoài một thủ tục lưu trữ như tôi.