用逗号分隔的字符串匹配特定的单词

问题描述:

我有一个允许的值列表,例如:猫,鼠标,狗和鹦鹉。 现在我想有可能在这个列表中以分号(;)隔开的单元格中添加许多值。用逗号分隔的字符串匹配特定的单词

这意味着我可以添加:

猫;狗;鼠标

猫;鹦鹉

鼠标;猫

鹦鹉

但我不能添加

狮子;猫

鼠标;鹦鹉;狮子

猫;(这意味着不能在末尾添加一个分号)

猫;鼠标;

;(这意味着我不能只是添加一个分号) 我尝试写使用此功能REGEXP_LIKE的约束,但这并不正常工作。

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

NB:动物是我申请的限制

+2

不这样做。不要在一个列中存储由某些字符分隔的多个值。阅读数据库规范化。不要走这条路。 –

前置分隔符的字符串匹配,那么像这样的列:

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

更新

你可以使用第二个表(带外键引用)或嵌套表:

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

感谢您的回答,这是有帮助的。但我已经省略了,表示我想要插入值为null或无值的可能性。我尝试修改你的答案,就像这样regexp_like(';'|| categories,'^(; \ s *(the cat | the mouse | the dog | the parrot | null | |)s)* $','一世')。但我现在可以插入null; – van

+0

@VannessaKemeni在Oracle中'NULL'和一个空字符串是相同的东西,所以你可以这样做:'CHECK(animal IS NULL OR REGEXP_LIKE(...))' – MT0

+0

真的不是:我添加约束动物是空的,但是当我想顶部插入值'空',这是行不通的。所以我已经在regexp_like(...)中添加了这个值。 – van

对于正则表达式的一部分,我相信这是最简单的正则表达式验证不需要操纵数据(注在';'之后有空格)

^(the cat|the mouse|the dog|the parrot|;)+$