
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ランキング
-
truncate tableを使って複数の...
-
既にテーブルが存在する場合の...
-
エラーを起こす方法
-
テーブル定義書(Oracle) 【IX】...
-
オラクルのUPDATEで複数テーブル
-
Where句のNot条件をAnd条件にし...
-
データ削除とSQL*Loaderでのイ...
-
accessのデータをoracleへinser...
-
[materialized]マテリアライズ...
-
【SQL】他テーブルに含まれる値...
-
SELECT INTOで一度に複数の変数...
-
フラグをたてるってどういうこ...
-
UPDATEで既存のレコードに文字...
-
PostgreSQLのtimestamp型で時間...
-
SQLサーバに対するSQL文で抽出...
-
sqlに記述できない文字
-
SQLで、Join句で結合したテ...
-
SQLで一定時間周期毎の抽出方法...
-
Accessの構成をコピーしたい
-
既存データをINSERT文にして出...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エラーを起こす方法
-
truncate tableを使って複数の...
-
オラクルのUPDATEで複数テーブル
-
既にテーブルが存在する場合の...
-
データ削除とSQL*Loaderでのイ...
-
accessのデータをoracleへinser...
-
テーブル定義書(Oracle) 【IX】...
-
複数レコードの複数フィールド...
-
AccessからOracle DB(View)を...
-
CASEでBETWEEN制約
-
任意のテーブルをdrop tableしたい
-
Oracle[10g]のSQL文について。(...
-
テーブルに変更があったらCSV出力
-
Oracleによるリンクテーブルで...
-
Where句のNot条件をAnd条件にし...
-
oracle ora-02298
-
ora-01722のエラーについて
-
複数テーブルにある個別フィー...
-
Oracle[10g]のSQL文について(新...
-
テーブルDROPできないのです。。。
おすすめ情報