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

JPAでのリレーションに関して

JPAではテーブルをクラスで定義します。もちろん例外とかはいろいろあるのですが、1テーブル1クラスというつくりで、これをエンティティと呼びます。 もともとクラスを作ってからDBを作成したり、JTAの規 …

no image

SQL基礎 case式について

case式に関して。 集約系の関数では複雑な処理を一気に行うことができる。 case式は1列のみ有効。複数の列に対して行うことはできない。 case ~ when ・・・thenではwhenが評価され …

no image

DBの基礎 テーブルとは

CSSを学習したあとはデータベースの学習などを。 参考図書:「達人に学ぶDB設計指南書」基本的にはこれを読んでいきます。が、現状よくわからないところは飛ばしていきます・・・ Contents1 テーブ …

no image

MySQLでのlocalhostと127.0.0.1の違い

たまにMySQLでローカルのホストに接続する時に、localhostで接続するときと127.0.0.1で接続するときで挙動が違う(片方だとエラーになり、もう片方だとエラーにならない)などがあるのでちょ …

no image

MySQLのパフォーマンスチェックなどについて

常日頃MySQLをつかっているのですがパフォーマンスのチェックなどをあまりしていなかったため、これをチョクチョクしていこうかなあと思っております。 簡単に使えるツール(ただし5.1.4から)としては標 …