T-SQL - GOTO 文の使い方
T-SQL の GOTO 文の使い方
ここでは、T-SQL の GOTO 文の使い方をご説明します。
GOTO 文を使うと、指定したラベルと位置まで、処理をスキップすることができます。
GOTO 文は多用すると、処理の流れが追いにくい、複雑なスクリプトになってしまいがちですが、便利な時もあるかと思います。
GOTO 文 は次のように定義して使えます。
... GOTO label_name; ... label_name: ...
ラベル名:(コロン)で GOTO 文のとび先の場所を指定します。
GOTO ラベル名 でその指定した場所まで処理を飛ばします。
実際に GOTO 文を使ってみましょう。
次のような Student・Test・TestResult テーブル があります。
シンプルに JOIN すると次のようになります。
ここから、次の優先順位で、条件に該当する学生だれか一人のレコードを取得したいとします。
1. 数学1で 100 点とったことある学生
2. どの科目でもいいので 100 点とったことある学生
3. どの科目でもいいので 90 点以上とったことある学生で、一番スコアが高い学生
4. どの科目でもいいので過去一番高い点数をとった学生
この優先順位で、条件に該当する学生だれか一人のレコードを取得するには、GOTO 文を使って次のようにできます。
DECLARE @StudentID INT; -- 1. 数学1で 100 点とったことある学生 PRINT 'Case 1'; SELECT @StudentID = S.StudentID FROM TestResult AS TR INNER JOIN Student AS S ON TR.StudentID = S.StudentID INNER JOIN Test AS T ON TR.TestID = T.TestID WHERE T.TestNameJp = N'数学1' AND TR.Score = 100; IF @StudentID IS NOT NULL GOTO FOUND; -- 2. どの科目でもいいので 100 点とったことある学生 PRINT 'Case 2'; SELECT @StudentID = S.StudentID FROM TestResult AS TR INNER JOIN Student AS S ON TR.StudentID = S.StudentID WHERE TR.Score = 100; IF @StudentID IS NOT NULL GOTO FOUND; -- 3. どの科目でもいいので 90 点以上とったことある学生で、一番スコアが高い学生 PRINT 'Case 3'; SELECT TOP 1 @StudentID = S.StudentID FROM TestResult AS TR INNER JOIN Student AS S ON TR.StudentID = S.StudentID WHERE TR.Score >= 90 ORDER BY TR.Score DESC; IF @StudentID IS NOT NULL GOTO FOUND; -- 4. どの科目でもいいので過去一番高い点数をとった学生 PRINT 'Case 4'; SELECT TOP 1 @StudentID = S.StudentID FROM TestResult AS TR INNER JOIN Student AS S ON TR.StudentID = S.StudentID ORDER BY TR.Score DESC; FOUND: SELECT StudentID, FirstName, LastName FROM Student WHERE StudentID = @StudentID;
それぞれの、ケースの後に IF @StudentID IS NOT NULL GOTO FOUND; で、StudentID が見つかった時に GOTO 文で FOUND のラベルまで処理をスキップしています。
[ 実行結果 ]
100 点をとった学生はいないので、1番・2番の条件にあてはまる学生はおらず、3番の「3. どの科目でもいいので 90 点以上とったことある学生で、一番スコアが高い学生」に当てはまる StudentID = 4 の学生のデータが取得できています。
Messages 画面には Case 1 ~ 3 までが Print されていて、Case 4 が Print されていないので、Case 4 のスクリプトがスキップされていることがわかります。
以上、T-SQL - GOTO 文の使い方についてご説明しました。