T-SQL - GOTO 文の使い方

T-SQL の GOTO 文の使い方

ここでは、T-SQL の GOTO 文の使い方をご説明します。

GOTO 文を使うと、指定したラベルと位置まで、処理をスキップすることができます。

GOTO 文は多用すると、処理の流れが追いにくい、複雑なスクリプトになってしまいがちですが、便利な時もあるかと思います。

これらのテーブルを使いますので、スクリプトを実行して確認したい方は こちら のスクリプトを実行して、Student・Test・TestResult テーブルを生成しておいてください。

GOTO 文 は次のように定義して使えます。

...
GOTO label_name;
...
label_name: 
...

ラベル名:(コロン)で GOTO 文のとび先の場所を指定します。

GOTO ラベル名 でその指定した場所まで処理を飛ばします。


実際に GOTO 文を使ってみましょう。

次のような Student・Test・TestResult テーブル があります。

T-SQL - GOTO 文の使い方 1

T-SQL - GOTO 文の使い方 2

T-SQL - GOTO 文の使い方 3


シンプルに JOIN すると次のようになります。

T-SQL - GOTO 文の使い方 4


ここから、次の優先順位で、条件に該当する学生だれか一人のレコードを取得したいとします。

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 のラベルまで処理をスキップしています。

[ 実行結果 ]
T-SQL - GOTO 文の使い方 5 T-SQL - GOTO 文の使い方 6

100 点をとった学生はいないので、1番・2番の条件にあてはまる学生はおらず、3番の「3. どの科目でもいいので 90 点以上とったことある学生で、一番スコアが高い学生」に当てはまる StudentID = 4 の学生のデータが取得できています。

Messages 画面には Case 1 ~ 3 までが Print されていて、Case 4 が Print されていないので、Case 4 のスクリプトがスキップされていることがわかります。


以上、T-SQL - GOTO 文の使い方についてご説明しました。

© 2010-2024 SQL Server 入門