我有一个允许的值列表,例如:猫,老鼠,狗和鹦鹉。 现在我希望有可能在用分号(;)分隔的单元格中添加此列表中的许多值。
这意味着我可以添加:
猫;狗;鼠标 猫;鹦鹉鼠标;那只猫
鹦鹉
但我无法添加
狮子;那只猫鼠标;鹦鹉;狮子
猫;(这意味着我最后不能添加分号)
猫;鼠标;
;(这意味着我不能只添加一个半冒号) 我尝试使用此函数regexp_like编写约束,但这不能正常工作。
not REGEXP_LIKE (animal, '[^(the cat| the mouse |the dog|the parrot|; )]', 'i')
N.B:animal是我应用约束的列
答案 0 :(得分:1)
将分隔符添加到字符串然后匹配如下:
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
答案 1 :(得分:0)
对于正则表达式部分,我相信这是最简单的验证正则表达式,不需要操纵数据(注意在&#39;之后有空格;&#39;)
^(the cat|the mouse|the dog|the parrot|; )+$