2012年1月25日水曜日

SQLメモ

いつも忘れるのでメモ。
日付がYYYY,MMと別項目に数値タイプで入っている場合、
たとえば2001年1月以降のデータを抽出したい時がある。
簡単にすますと、
SELECT * FROM MASTER M
WHERE
M.START_Y * 100 + M.START_M >= 200101
なんてやってしまいがち。でも、これだと、START_YとSTART_Mにインデックスが張られていても、
使用されない。
インデックスを使用するようにするには、計算させなければ良いので、以下のように書き換える。
SELECT * FROM MASTER M
WHERE
(
  (M.START_Y > 2001)
 OR
 (M.START_Y = 2001 AND M.START_M >= 01)
)
応用編として、
M.START_Y * 100 + M.START_M BETWEEN 200004 AND 200103を書き換えてみる

(
  (
   (M.START_Y > 2000)
   OR
   (M.START_Y = 2000 AND M.START_M >= 04)
  )
  AND
  (
   (M.START_Y < 2001)
   OR
   (M.START_Y = 2001 AND M.START_M <=03)
  )
 )
可読性は落ちるけれど、これでインデックスが使用されるようになる。

0 件のコメント:

コメントを投稿