用逗号分隔的字符串匹配特定的单词
我有一个允许的值列表,例如:猫,鼠标,狗和鹦鹉。 现在我想有可能在这个列表中以分号(;)隔开的单元格中添加许多值。用逗号分隔的字符串匹配特定的单词
这意味着我可以添加:
猫;狗;鼠标
猫;鹦鹉
鼠标;猫
鹦鹉
但我不能添加
狮子;猫
鼠标;鹦鹉;狮子
猫;(这意味着不能在末尾添加一个分号)
猫;鼠标;
;(这意味着我不能只是添加一个分号) 我尝试写使用此功能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'
)
更新:
你可以使用第二个表(带外键引用)或嵌套表:
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
感谢您的回答,这是有帮助的。但我已经省略了,表示我想要插入值为null或无值的可能性。我尝试修改你的答案,就像这样regexp_like(';'|| categories,'^(; \ s *(the cat | the mouse | the dog | the parrot | null | |)s)* $','一世')。但我现在可以插入null; – van
@VannessaKemeni在Oracle中'NULL'和一个空字符串是相同的东西,所以你可以这样做:'CHECK(animal IS NULL OR REGEXP_LIKE(...))' – MT0
真的不是:我添加约束动物是空的,但是当我想顶部插入值'空',这是行不通的。所以我已经在regexp_like(...)中添加了这个值。 – van
对于正则表达式的一部分,我相信这是最简单的正则表达式验证不需要操纵数据(注在';'之后有空格)
^(the cat|the mouse|the dog|the parrot|;)+$
不这样做。不要在一个列中存储由某些字符分隔的多个值。阅读数据库规范化。不要走这条路。 –