2

我有一个允许的值列表,例如:猫、老鼠、狗和鹦鹉。现在我想有可能从这个列表中添加许多值到一个用分号 (;) 分隔的单元格中。

这意味着我可以添加:

那只猫; 狗; 鼠标

那只猫; 鹦鹉

鼠标; 那只猫

鹦鹉

但我不能添加

狮子; 那只猫

鼠标; 鹦鹉;狮子

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

那只猫; 鼠标;

;(这意味着我不能只添加一个分号)我尝试使用这个函数 regexp_like 编写一个约束,但这不能正常工作。

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

注意:动物是我应用约束的列

4

2 回答 2

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 
于 2017-04-20T09:06:51.427 回答
0

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

^(the cat|the mouse|the dog|the parrot|; )+$
于 2017-04-21T13:13:05.023 回答