【问题标题】:Match specific words in comma delimited string匹配逗号分隔字符串中的特定单词
【发布时间】:2017-04-20 08:58:54
【问题描述】:

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

这意味着我可以添加:

猫;狗;鼠标

猫;鹦鹉

鼠标;猫

鹦鹉

但我不能添加

狮子;猫

鼠标;鹦鹉;狮子

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

猫;鼠标;

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

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

注意:animal 是我应用约束的列

【问题讨论】:

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

标签: sql regex oracle regexp-like


【解决方案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 

【讨论】:

  • 感谢您的回答,这很有帮助。但我已经承诺表明我希望有可能插入值 null 或没有值。我试图像这样修改你的答案 regexp_like(';' || categories, '^(;\s*(the cat|the mouse|the dog|the parrot|null| |)\s*)*$', '一世')。但我现在可以插入 null;
  • @VannessaKemeni In Oracle NULL 和一个空字符串是一回事,所以你可以这样做:CHECK ( animal IS NULL OR REGEXP_LIKE( ... ) )
  • 真的不是:我添加了约束动物为空,但是当我想在顶部插入不起作用的值“空”。所以我在 regexp_like(...) 中添加了这个值。
  • 在我的真实示例中,我有 fast16 个单词,oracle 说正则表达式太长。我该如何处理?
  • @ MT0 你的回答正是我想要的。但问题是我的真实值列表太长,我收到错误 ORA-12733:正则表达式太长。现在我想知道是否有另一种方法可以在不使用正则表达式的情况下解决这个问题。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    相关资源
    最近更新 更多