実用的な SELECT の使用例
SQL 文の特殊文字のエスケープ
ワイルドカード文字、パーセント(%)、アンダーバー、アンダースコア(_)を LIKE で抽出条件に使用するための方法
(パーセント(%)は 0 文字以上の任意の文字列、アンダースコア(_)は 任意の 1 文字をあらわす)
'dummy%' を後方一致で検索する例
SELECT *
FROM USER_MASTER
WHERE USER_NAME LIKE '%dummy\%' ESCAPE '\';
SELECT *
FROM USER_MASTER
WHERE USER_NAME LIKE '%dummy#%' ESCAPE '#';
参考:SQL*Plus の特殊文字をエスケープする
クロス集計
いろいろなクロス集計方法
SELECT
SUM(CASE VAL WHEN 1 THEN 1 ELSE 0 END ) AS "1"
,SUM(CASE VAL WHEN 2 THEN 1 ELSE 0 END ) AS "2"
,SUM(CASE VAL WHEN 3 THEN 1 ELSE 0 END ) AS "3"
FROM
GROUP_TEST;
SELECT
SUM(DECODE( VAL, 1, 1, 0, 0 ) AS "1"
,SUM(DECODE( VAL, 2, 1, 0, 0 ) AS "2"
,SUM(DECODE( VAL, 3, 1, 0, 0 ) AS "3"
FROM
GROUP_TEST;
CUBE集計
SELECT
SUM(CASE VAL WHEN 1 THEN COUNT(*) ELSE 0 END) AS "値1"
,SUM(CASE VAL WHEN 2 THEN COUNT(*) ELSE 0 END) AS "値2"
,SUM(CASE VAL WHEN 3 THEN COUNT(*) ELSE 0 END) AS "値3"
,SUM(CASE VAL WHEN 4 THEN COUNT(*) ELSE 0 END) AS "値4"
,SUM(CASE VAL WHEN 5 THEN COUNT(*) ELSE 0 END) AS "値5"
,SUM(CASE VAL WHEN 6 THEN COUNT(*) ELSE 0 END) AS "値6"
,SUM(CASE VAL WHEN GROUPING(VAL) THEN COUNT(*) ELSE 0 END) AS "合計"
FROM
GROUP_TEST
GROUP BY CUBE ( VAL );
バインド変数により SQL を組み立て直す
この DECODE は SELECT 項目だけでなく、テーブル以外の部分でほぼ使用できる。
しかし、DECODE によって結合条件が変動するなどで入力パラメータの操作によって 実行計画 が固定化しない SQL の場合、
統計情報が使用できない。
そのときは、デフォルト統計か動的サンプリングが発生する(と思う)ので、あまりお勧めできない手法ではある。
(1) 抽出項目をシフトさせる。
SELECT
DECODE(:FETCH_TYPE, 1, A, 2, B, 3, C, 4, D)
,DECODE(:FETCH_TYPE, 1, B, 2, C, 3, D)
,DECODE(:FETCH_TYPE, 1, C, 2, D)
,DECODE(:FETCH_TYPE, 1, D)
FROM ABCD_TBL;
(2) 並び替え項目を入れ替える。
SELECT COL1
FROM TBL_A
ORDER BY
DECODE(:ORDER_TYPE, 1, COL1, 2, COL2),
DECODE(:ORDER_TYPE, 1, COL2, 2, COL1)
(3) 結合先を動的に変化させる。
SELECT
TBL_A.colx
FROM TBL_A, TBL_B
WHERE
DECODE(:JOIN_TYPE, 1,TBL_A.COL1, 2, TBL_A.COL2, TBL_A.COL3)
= DECODE(:JOIN_TYPE, 1, TBL_B.COL1, 2, TBL_B.COL2, TBL_B.COL3) ;
(4) グループ化を変化させる。
SELECT
DECODE(:ORDER_TYPE, 1, COL1, 2, COL2)
FROM TBL_A
GROUP BY
DECODE(:ORDER_TYPE, 1, COL1, 2, COL2)
関連事項