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

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

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

no image

自己結合のイメージ

前回に引き続き結合について考えます。 例えば下記のようなテーブルがあり、重複行を削除するとします。 1 りんご 50 2 みかん 100 3 みかん 100 4 みかん 100 5 バナナ 80 この …

no image

フィールド以外のプロパティをエンティティに持たせる

JPAでは基本的に1テーブル、1クラスです。 このためプロパティは必然的にテーブルのフィールドに対応しています。 ただ、必ずしもプロパティだけでなく、臨時で持たせておきたい、プロパティがあったりします …

no image

MySQLでtext型が大量にあるもののリストア 

MySQLでのリストアについて。 先日実務でtext型のカラムが複数あるテーブルを読もうとしたら下記エラーがでてこけました。

なにやら …

no image

大規模Webサービス技術入門 DBの分散

前回に引き続き、大規模サービスを運用するときに必要になるMySQLの知識についてのまとめ Contents1 テーブル・SQL設計2 レプリケーション機能3 パーティショニング テーブル・SQL設計 …