プロが教える店舗&オフィスのセキュリティ対策術

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で上記のような制約をつけることは可能でしょうか?

A 回答 (1件)

>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
)

綺麗な式ではないけど、構文的&論理的には正しい式なので、通ると思いますよ。
    • good
    • 0
この回答へのお礼

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

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

お礼日時:2009/10/28 09:20

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す