質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

2回答

63987閲覧

case式の入れ子について

k_mail

総合スコア90

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

1クリップ

投稿2017/05/04 22:37

編集2017/05/04 22:41

SQLの勉強をし始めました。
「達人に学ぶSQL徹底指南書」でCase式の入れ子(p15)で質問です。

「女性社員の給料は20万円以下」という
言語道断の人事テーブルのCHECK制約についてです。

回答は
constraint check_sarary CHECK(
case when sex = '2' then case when salary <= 200000
then 1 else 0 end
else 1 end = 1)
です。

なぜCase式を入れ子にする必要があるのでしょうか。
また、salary <= 200000以降の
「then 1 else 0 end
else 1 end = 1」の意味も分かっていません

constraint check_sarary CHECK(
case when sex = '2' then salary <= 200000
else salary end)
とはならないのでしょうか。

ご返信は夜になると思いますが、
宜しくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

CASEを入れ子にする必要はあまりないと思います。
「女性社員の給料は20万円以下という」問題文に沿った条件をそのまま記述したために入れ子になっているのだと思います。

CASE文はWHENの条件を満たすときにTHENを返しそれ以外はELSEの値を返します。
WHENのあとの条件はANDやORで複数の条件を書くことができるのでこちらのような書き方でも問題ないと思います。

SQL

1(case when (sex = '2') and (salary > 200000) 2 then 0 3 else 1 4end) = 1

投稿2017/05/05 02:59

編集2017/05/05 03:40
shiroyuki

総合スコア169

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

constraint check_sarary CHECK(

case when sex = '2' then case when salary <= 200000
then 1 else 0 end
else 1 end = 1)

ごちゃごちゃしていますが、インデントをちゃんとしてやればスッキリします。

(case when sex = '2' then (case when salary <= 200000 then 1 else 0 end) else 1 end) = 1

女性かつ給料が20万以上は0となるcase文が1になるようcheck制約をかける、という感じです。

constraint check_sarary CHECK(

case when sex = '2' then salary <= 200000
else salary end)
とはならないのでしょうか。

型が違うのでだめです。salary <= 200000 は boolean、salary は数値です。
else true end ならOKですが、oracle は boolean を SQL に書けないのでこれでもだめです。

ここであえて入れ子 case を使っているのは直後にある論理積と条件法の解説のためですので、こうじゃないと書けないというわけではないです。case式を入れ子にする必要はありません。

投稿2017/05/04 23:33

TakeoAsai

総合スコア880

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k_mail

2017/05/05 23:13

問題の意図としては 言語道断の人事テーブルには 「女性で、かつ給料が20万より大きい人」は問題があるので、 0のフラグを立て, それ以外の人は問題ないので、1のフラグにするということでしょうか。 --女性(sex='2')だったら (case when sex = '2' then   --(女性でかつ)給料が20万円以下だったら (case when salary <= 200000 then     --フラグを1にする 1     --20万より大きかったら(salary > 200000だったら) else    --フラグを0にする    --(フラグが0は女性かつ給料が20万より大きいので    --言語道断の人事テーブルにふさわしくないという意味の0) 0 end) 女性じゃなかったら(sex ='2'じゃなかったら(男性だったら)) else 1 --↓すいません。この意味が分かっていないです。 end) = 1
TakeoAsai

2017/05/05 23:43

> それ以外の人は問題ないので、1のフラグにする はい。その通りです。 > end) = 1 case 文が長いのですが構造は x = 1 と同じです。x の部分が入れ子の case 式です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問