みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

CASEでBETWEEN制約

Oracle9i にて制約をつける際の質問です。

以下のようなテーブル構造の場合に、
NAME列にCASEで分岐してBETWEENでCHECK制約をつけようとしていますが、
エラーとなってしまいます。(ORA-00920: 関係演算子が無効です。)

テーブル名:TEST2
ID NUMBER
GEND NCHAR(1)
NAME NVARCHAR2(100)

制約:
ALTER TABLE TEST2 ADD CONSTRAINT NAME_CHK CHECK (
NAME CASE
WHEN GEND = '1' THEN BETWEEN 'a' AND 'z'
WHEN GEND = '2' THEN BETWEEN 'A' AND 'Z'
ELSE BETWEEN '1' AND '9'
END
)

CASEで上記のような制約をつけることは可能でしょうか?

投稿日時 - 2009-10-26 13:01:13

QNo.5397777

暇なときに回答ください

質問者が選んだベストアンサー

>CASEで上記のような制約をつけることは可能でしょうか?

その壊れた構文のCASE式では、エラーになって当たり前かと。
正しい構文であれば、CASEを使ったチェックも可能かと思いますよ。

たとえば、
CHECK (
CASE
WHEN (GEND = '1') AND (NAME BETWEEN 'a' AND 'z') then 1
WHEN (GEND = '2') AND (NAME BETWEEN 'A' AND 'Z') then 1
WHEN (NAME BETWEEN '1' AND '9') then 1
ELSE 0
END = 1
)

綺麗な式ではないけど、構文的&論理的には正しい式なので、通ると思いますよ。

投稿日時 - 2009-10-27 20:45:39

お礼

なるほど、このような書き方ができるんですね。
THEN の値と、ENDの後の値を比較するという発想がなかったです。

ありがとうございました。勉強になりました。

投稿日時 - 2009-10-28 09:20:23

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問