2017-04-20 15 views
2

私は、猫、マウス、犬、そしてオウムのような許可された値のリストを持っています。 これで、セミコロン(;)で区切られたセルにこのリストから多くの値を追加することができます。私は追加することができます意味コンマで区切られた文字列で特定の単語を一致させる

猫。犬;マウス

猫;オウム、

マウス;猫

オウム

しかし、私は

ライオンを追加することはできません。猫

マウス;オウム。ライオン

猫は、

猫を(それは私が最後にセミコロンを追加することはできませんを意味します)。ハツカネズミ;

;(それは私がちょうどセミコロンを追加することはできません意味) 私は、この機能のREGEXP_LIKEを使用して制約を書き込もうが、これは正常に動作しません。

not REGEXP_LIKE (animal, '[^(the cat| the mouse |the dog|the parrot|;)]', 'i') 

NB:

REGEXP_LIKE(
    ';' || animal, 
    '^(;\s*(the cat|the mouse|the dog|the parrot)\s*)*$', 
    'i' 
) 

更新

あなたは可能性を動物には、私は、制約

+2

これをしないでください。ある文字で区切られた複数の値を1つの列に格納しないでください。データベースの正規化について読んでください。この道を下ってはいけない。 –

答えて

1

前に付加文字列に区切り文字は、このように一致を適用コラムです2番目のテーブル(外部キー参照付き)またはネストしたテーブルを使用します。

CREATE TYPE stringlist IS TABLE OF VARCHAR2(4000); 
/

CREATE TABLE animals (
    id   number, 
    animal_list stringlist 
) NESTED TABLE animal_list STORE AS animals__animal; 

ALTER TABLE ANIMALS__ANIMAL ADD CONSTRAINT animals__animal__chk 
    CHECK (TRIM(BOTH FROM LOWER(column_value)) 
      IN ('the cat', 'the mouse', 'the dog', 'the parrot')); 

INSERT INTO animals VALUES (1, StringList('the cat', ' the dog ')); 
-- Succeeds 
INSERT INTO animals VALUES (2, StringList('the cat', 'the horse')); 
-- Fails with ORA-02290: check constraint (TEST.ANIMALS__ANIMAL__CHK) violated 

次に、あなたが行うことができます:出力

SELECT id, 
     (SELECT LISTAGG(COLUMN_VALUE, ';') WITHIN GROUP (ORDER BY ROWNUM) 
     FROM TABLE(a.animal_list)) AS animals 
FROM animals a; 

ID ANIMALS 
-- ----------------- 
1 the cat; the dog 
+0

このお返事ありがとうございました。しかし、私は値を挿入する可能性を持っていることを示すためにommittedしているか、値がない。私はこのregexp_like( ';' ||カテゴリ、 '^(; \ s *(猫|マウス|犬|オウム|ヌル| |)\ s *)* $'、 '私')。しかし、今私はnullを挿入することができます。 – van

+0

@VannessaKemeni Oracleで 'NULL'と空文字列は同じものなので、次のようにすることができます:' CHECK(動物はNULLかREGEXP_LIKE(...)) ' – MT0

+0

実際にはありません:私は制約動物をnullを追加しますが、私は上部に値 'null'を挿入したい場合は動作しません。だから私はregexp_like(...)でこの値を追加しました。 – van

0

を正規表現の部分については、私はノート(これはデータを操作する必要はありません。最も簡単な検証正規表現であると考えています';'の後ろに空白があります)

^(the cat|the mouse|the dog|the parrot|;)+$ 
関連する問題