• ベストアンサー
  • すぐに回答を!

正規表現を使用したCHECK制約

alter tableでカラムにCHECK制約を付けて、エラーとなるようなデータをsqlldrでローディングしたのですが、想定通りにエラーとならなくて困っています。 CHECK制約はこのようなものです。 ALTER TABLE TABLE_XXX ADD( constraint ck_A check (REGEXP_REPLACE(列A, '[0-9]{4}','') = '') ); 列Aの値が半角数字4桁以外のデータはローディングエラー(別ファイルに出力)にしたいのですが、すんなりとテーブルに格納されてしまいます。 ちなみに同様に付けたprimary key制約は正常に機能しているので、正規表現がいけないのでは?と推測しますが。。。 想定通りにするためには、どのように記述したら良いのでしょうか? 正規表現、Oracle共に勉強し始めの為、本など読んでいるのですが、なかなか良い資料が手元になく困っています。 よろしくお願いします。

共感・応援の気持ちを伝えよう!

  • Oracle
  • 回答数1
  • 閲覧数876
  • ありがとう数1

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

  • ベストアンサー
  • 回答No.1

正規表現がいけないのではなく、条件の書き方の問題だと思います。 Oracleには空文字はなく、NULLとみなされるため、 REGEXP_REPLACE(列A, '[0-9]{4}','') IS NULL と書かないといけないということでしょう。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

大変遅くなり申し訳ありません。 とても参考になりました。 ありがとうございました。

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

  • NOT NULL 制約の削除

    MSSQL(SQLServer2000)にて、NOT NULLの列制約をはずすにはどうしたらよいのでしょうか。 ALTER TABLE <テーブル名> ALTER COLUMN <列名> DROP NOT NULL をやってみたのですが、構文エラーになってしまいます。 よろしくお願いします。

  • これは正規表現とは言えないでしょうか?

    正規表現を勉強しようと思っているのですが まずはじめに確認させて下さい。VBAです。 Sub 正規表現() If a Like "*a*" Then End If End Sub は正規表現とは言えないでしょうか? *を使っているからそう思いました。 Dim re As RegExp Set re = New RegExp を使わないと、正規表現といえないのでしょうか? よろしくお願い致します。

  • PostgreSQLの「not null」制約の追加

    こんにちは。いつもお世話になります。 PostgreSQLのversion7.2.8で、「not null」制約の追加、削除の方法をおたずねします。よろしくお願いします。 ALTER TABLE テーブル名 ALTER COLUMN カラム名 SET NOT NULL; で試したところ、syntaxエラー(構文エラー)で失敗。 ALTER TABLE テーブル名 ALTER COLUMN カラム名 DROP NOT NULL; で試してみても、同じくsyntaxエラーです。 version7.2.8が原因でしょうか? また、version7.2.8でも「not null」制約の追加、削除が できる他の方法はありますでしょうか? テーブルを作り直さずに、 既存のテーブルのカラムへの制約の追加、削除をしようとしています。 よろしくお願いします。

  • 正規表現について教えてください。

    正規表現について教えてください。 Oracleで開発を行っている者ですが、ネットや本で調べても わからない箇所がありましたので、ここに質問として挙げさせていただきます。 ご教示いただけると幸いです。 現在、下記のようなデータが入ったテーブルがあります。 ---------------------------------------------------------------------------------- ID | SENTENCE          | REG_EXP ---------------------------------------------------------------------------------- 1 | <○○○:XXXX>      | [^<][^:]+ ---------------------------------------------------------------------------------- 2 | <○○○:XXXX>→<△△△:XXXX> | ---------------------------------------------------------------------------------- 3 | ■■■■■<○○○:XXXX> | ---------------------------------------------------------------------------------- このテーブルを使って、アプリを作っているのですが、 期待動作としては、SENTENCEの列に入っている文字列を REG_EXPの列に入っているデータ(正規表現のパターン)で マッチした文字列を切り取るようにしたいのです。 例えば、IDが1の場合は○○○が切り取られるのが期待動作です。 (注.この動作は、REGEXP_SUBSTR関数を用いてSQLで実行します。) お聞きしたいのは、IDが2の場合は△△△を、IDが3の場合は○○○を、 配列の最初の要素に入れるには、正規表現をどのように記載すればよいのか、ということです。 ○、△、■、Xの部分は英数字、日本語のどれが入るのかはわかりませんが、 <や→、:などの全角記号のフォーマットはこのままになります。。 IDが2の正規表現は[^<:→]+[^<:→]+[^<:→]+ で試してみたのですが、 うまく出来ませんでした・・・。 テーブルの線の調整がうまくできず、 表が見づらくて申し訳ありませんが、 正規表現に詳しい方、ご教示をよろしくお願いいたします。

  • Javascriptでの正規表現(RegExp)

    RegExpで「{a|b}」という文字列を「c」に書き換えるための正規表現はどう書けば良いのでしょうか? 雰囲気としては "XXXXXXXXX {a|b} YYYYYYYY".replace(new RegExp(正規表現, 'g'), "c"); → "XXXXXXXXX c YYYYYYYY" というのをやりたいです。 できれば"{a|b}"の部分は間にスペースやタブが入っても良いようにしたいのですが複雑になるなら"{a|b}"だけでも構いません。 よろしくお願いします。

  • DB2でUNIQUE制約を削除したい

    DB2で以下のように明示的な名前のないUNIQUE制約を削除したいのですが、よい方法をご存じの方がおられましたらご教授ください。 (例) 1. 表の作成 CREATE TABLE TEST ( COL1 INT NOT NULL) 2. 明示的な名前を作成せずにUNIQUE制約を作成 ALTER TABLE TEST ADD UNIQUE (COL1); 上記のように名前指定しなかったUNIQUE制約を ALTER TABLE文で削除したいのですが、どのように すればよろしいのでしょうか? マニュアルの構文では制約名を指定する必要あるようで、 syscat.tabconstカタログで自動でつけられた制約名を調べた後、 以下のように指定したところ制約は削除されました。 (例) ALTER TABLE TEST DROP CONSTRAINT SQL090123084403480 しかしプログラムの修正が少なくなるよう、制約名を調べずにALTER TABLE 一文で削除できないものかと悩んでおります。 もしくはストアドプロシージャでも構いません。 よろしくお願いします。

  • 正規表現

    正規表現で 数値と半角記号(!#$%()~|-^@[;],./`{+*}_)が入っているというものを表現したいのですが、、、 下記のような正規表現をすると、エラーになってしまいます。何かよい方法はありませんか? ^[a-zA-Z0-9\-_!#$%()~|-^@[;],./`{+*}_]*$ 又、携帯電話のチェックをしたいのですが、 1文字以上の文字列があってというような処理にしたいのですが、何かよい方法はないでしょうか? ereg( "@docomo\.ne\.jp$", $email )

    • ベストアンサー
    • PHP
  • 正規表現で入力チェックするには。

    正規表現を使用して入力チェックをしようと考えていますが特殊記号文字がうまくいきません。 [0-9a-zA-Z]で英数字はチェックする事ができたんで下記の特殊文字を指定するとエラーになってしまい困っています。 「!"#$%&'()=~|`{+*}<>?_-^\@[;:],./」 ロジックは以下のように記述しています。 Pattern p = Pattern.compile("[0-9a-zA-Z!\"#$%&'()=~|`{+*}<>?_-^\\@[;:],./]"); Matcher m = p.matcher("文字列"); if(m.matches() == true){   System.out.println("1"); } else{   System.out.println("2"); } ※「\」と「"」はエスケープしています。 下記のエラーメッセージが表示されてなんとなくですが正規表現でエラーになっているのはわかるんですが・・・ Illegal character range near index 32 [0-9a-zA-Z!"#$%&'()=~|`{+*}<>?_-^\@[;:],./]                       ^ 申し訳ありませんがアドバイスいただけませんでしょうか? 宜しくお願いします。

    • ベストアンサー
    • Java
  • 正規表現内に変数を使用する方法

    match() や replace() の第1引数に文字列ではなく正規表現を使用 できますがこの正規表現内に変数を使用する場合、どうやったらよいの でしょうか。 var str = 'てすと'; alert(str.replace(/str/, 'テスト')); とすることができません。 (Perlではパターン内に変数が使用できるのですがJSでは変数が使用 できません) http://ar.aichi-u.ac.jp/blog/js-replace.html に書いてあるように第1引数に文字列を渡すと正規表現ではなくただの 文字とのマッチになってしまうようなので(確認済み)使えません。 面倒ですがリンク先にあるようにnew RegExpでRegExpオブジェクトを 作ってやる方法しかないんでしょうか。