- Home
- SQL Server
- [SQL Server]パラメーターにより実行するクエリを変更する(IF文)
[SQL Server]パラメーターにより実行するクエリを変更する(IF文)
- 2017/6/15
- SQL Server
- IF, UNION ALL, 実行するクエリを切り替える
- コメントを書く
画面のパラメータにより異なる検索条件や、異なるテーブルのデータを取得する際。
「UNION ALL」か「IF」で、取得するデータを切り替える方法がある。
「UNION ALL」と「IF」のどちらを使うか
「UNION ALL」の問題点
下記クエリのようにUNION ALLで検索条件の異なるクエリを繋げて、パラメーターで抽出するデータを選択する方法もあるが、上のSQLと下のSQLのデータを外部結合などで両方活用する場合。
例えば上のSQLが上期の売上データで、下のSQLが下期の売上データで、両方とも画面に表示する場合は、「UNION ALL」を使用してかまわない。
しかし、上のSQLのデータと、下のSQLのデータのどちらか一方しか使わないという、下記のSQL例だと、パフォーマンス的に難がある。
例えば、上のSQLで5万件、下のSQLで10万件のデータが取得されるとすると、パラメータにより5万件のデータを取得したいが、上下15万件のデータを取得した後に、5万件を抽出することになる。
10万件の不要なデータを取得する処理時間がもったいないのである。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
DECLARE @TABLE table ( ID int NOT NULL, ITEM_ID varchar(4) NOT NULL, ITEM_NM varchar(50) NOT NULL, QTY int NOT NULL ) INSERT INTO @TABLE VALUES (1,'0001','商品A',10) INSERT INTO @TABLE VALUES (2,'0002','商品B',20) DECLARE @BUNKI varchar(1) = '0' SELECT * FROM ( SELECT '0' AS KBN, ID, ITEM_ID, ITEM_NM, QTY FROM @TABLE WHERE ITEM_ID = '0001' UNION ALL SELECT '1' AS KBN, ID, ITEM_ID, ITEM_NM, QTY FROM @TABLE WHERE ITEM_ID = '0002' ) MAIN WHERE KBN = @BUNKI |
どちらか一方のデータを使うのならIF文で分岐する
どちらか一方のデータを使うのならIF文で分岐すれば、不要な行を取得することなく、パフォーマンスも上がる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
DECLARE @TABLE table ( ID int NOT NULL, ITEM_ID varchar(4) NOT NULL, ITEM_NM varchar(50) NOT NULL, QTY int NOT NULL ) INSERT INTO @TABLE VALUES (1,'0001','商品A',10) INSERT INTO @TABLE VALUES (2,'0002','商品B',20) DECLARE @BUNKI varchar(1) = '1' IF (@BUNKI = '0') BEGIN SELECT * FROM @TABLE WHERE ITEM_ID = '0001' END ELSE BEGIN SELECT * FROM @TABLE WHERE ITEM_ID = '0002' END |
コメント
この記事へのトラックバックはありません。
この記事へのコメントはありません。