Top > SQL 入門 > SELECT 文の活用(実践)

実用的な 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 を組み立て直す

この DECODESELECT 項目だけでなく、テーブル以外の部分でほぼ使用できる。 しかし、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)


関連事項


日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ Oracle Web セミナー