
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で上記のような制約をつけることは可能でしょうか?
No.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
)
綺麗な式ではないけど、構文的&論理的には正しい式なので、通ると思いますよ。
なるほど、このような書き方ができるんですね。
THEN の値と、ENDの後の値を比較するという発想がなかったです。
ありがとうございました。勉強になりました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
オラクルのUPDATEで複数テーブル
-
既にテーブルが存在する場合の...
-
truncate tableを使って複数の...
-
エラーを起こす方法
-
データ削除とSQL*Loaderでのイ...
-
9iと10gでの実行計画の違いにつ...
-
AccessでOracleDBを扱う場合の...
-
ORA-01630の対応方法について
-
VB6.0 DAO ORACLE ヒント使用方...
-
テーブル定義書(Oracle) 【IX】...
-
accessのデータをoracleへinser...
-
CASEでBETWEEN制約
-
テーブルに変更があったらCSV出力
-
oracle ora-02298
-
【SQL】他テーブルに含まれる値...
-
UPDATEで既存のレコードに文字...
-
SELECT INTOで一度に複数の変数...
-
フラグをたてるってどういうこ...
-
sqlに記述できない文字
-
既存データをINSERT文にして出...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
truncate tableを使って複数の...
-
オラクルのUPDATEで複数テーブル
-
エラーを起こす方法
-
既にテーブルが存在する場合の...
-
テーブル定義書(Oracle) 【IX】...
-
データ削除とSQL*Loaderでのイ...
-
CASEでBETWEEN制約
-
AccessからOracle DB(View)を...
-
[materialized]マテリアライズ...
-
テーブルに変更があったらCSV出力
-
エクスポート不具合
-
ORA-01630の対応方法について
-
accessのデータをoracleへinser...
-
複数レコードの複数フィールド...
-
VB6.0 DAO ORACLE ヒント使用方...
-
ora-01722のエラーについて
-
Where句のNot条件をAnd条件にし...
-
oracle ora-02298
-
任意のテーブルをdrop tableしたい
-
pro*cobol ⇔ oracle のデータ型...
おすすめ情報