以逗号分隔的字符串

时间:2017-04-20 08:58:55

标签: sql regex oracle regexp-like

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

这意味着我可以添加:

  猫;狗;鼠标

     猫;鹦鹉

     

鼠标;那只猫

     

鹦鹉

但我无法添加

  狮子;那只猫

     

鼠标;鹦鹉;狮子

     

猫;(这意味着我最后不能添加分号)

     猫;鼠标;

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

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

N.B:animal是我应用约束的列

2 个答案:

答案 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|; )+$