skillup

技術ブログ

Database

CASE式のすすめ その2

投稿日:

本日も「達人に学ぶSQL徹底指南書」を地道に進めていきます。

CASE式の利用

私自身はCHECK制約を使ったことはないですが、正しいテーブル設計においてはこれがあると誤ったデータを入れることを防ぐことができます。

例 会計年度のはじめと終わりを定義したのに、終わりのほうが昔になっているなど。

またCASE式ではCHECK制約と相性がいいです。

使い方については本家を参考に。

CHECK制約はNOT NULLやUNIQUE同様正しい値のみを格納できるので積極的に使っていく必要ありかもです。

制約に関していろいろ↓

http://kaya-soft.com/sqlserver2008-toranomaki/beginner/constraint/
http://qiita.com/Uejun/items/de02b78adbc54868d40d

UPDATE文のCASE

CASE式は条件分岐にも使えます。

例えば下記のようなテーブルsalarytbがあるとします。

name | salary
——+———
相田 | 200000
田中 | 300000

ここで以下のような条件で更新するとします。

  • 30万以上の社員は15%アップ
  • 20万以上30万未満(299999以下)の社員は20%アップ

これも1行で以下のように書けます。

この場合、UPDATE文を2回すると290000の社員は2回昇給をしてしまいます。

テーブル同士のマッチング

CASE式の大きな利点は式を評価でき、bETWEENやLIKE、大小判定などが使えることです。

テーブル名 CourseMaster
course_id | course_name
———–+————-
1 | 経理入門
2 | 財務知識
3 | 簿記検定
4 | 税理士

テーブル名  OpenCourse
month | course_id
——–+———–
200706 | 1
200706 | 3
200706 | 4
200707 | 4
200708 | 2
200708 | 4

ここで下記のような表を作りたいとします。

course_name | 6月 | 7月 | 8月
————-+—–+—–+—–
経理入門 | ○ | × | ×
財務知識 | × | × | ○
簿記検定 | ○ | × | ×
税理士 | ○ | ○ | ○

この場合、下記のようにSQLを書けばOKです。

EXISTSを使っても似たようなものができますね。

コツとしてはまず骨組みとなるSQL(外の部分のSQL)を作ってから細かいもの(中の詳細な条件)を組み立てていくのがいいのかなと思っております。

-Database
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

mavenのリモートリポジトリについて

JPAでO/Rマッパーに慣れてからというもの通常のSQLをごりごり書くのが億劫になってきました。 億劫というかいろいろとリスクがありますね。 問題点としてはコンパイルするときにエラーが検知できなかった …

no image

アンチパターン 参照渡しと値渡し+キー情報の設定+同一値を複数テーブルに配置+正規化が不十分+集計表+不適切なステータス値

本日は自分がデータベースの設計をしていて気を付かないといけないなーと思った点などを。 注意点としては設計のミスは実装で取り返しにくいことが多いので極力気を付けましょう。あといろいろなテーブルのパターン …

no image

MySQLでの日付関数

MySQLでSUMやCOUNTなんかはよく使うと思うのですが、日付の関数なんかもかなり使います。 今回は、日付の日数をとりたいときの関数を紹介。 例えばあるカラムにある日付が入力されており、現在との日 …

no image

JavaでのSQLの書き方

ちょっと小ネタです。 通常SQLを記述する場合、縦に分けて書くのが見た目にも見やすく、保守性も高いです。 例として

と書くよりは、 [ …

no image

JPQLでの算術関数

複雑なJPQLを書いていると、通常のレコードの取り出しだけではなく、合計(SUM)や算出(COUNT)などのいわゆる算術関数を使うことが一般的です。 JPQLでもこれらを通常通り扱うことができます。 …