2017-04-20 10 views
2

고양이, 마우스, 개, 앵무새 등 허용되는 값 목록이 있습니다. 이제 세미콜론 (;)으로 구분 된 셀에이 목록의 많은 값을 추가 할 수 있습니다. 내가 추가 할 수 있음을 의미쉼표로 구분 된 문자열로 특정 단어 일치

:

고양이를; 개; 마우스

고양이; 앵무새

마우스; 고양이는

앵무새는

하지만

사자를 추가 할 수 없습니다; 고양이

마우스; 앵무새; 사자

고양이,

고양이를 (그게 내가 마지막에 세미콜론을 추가 할 수 없음을 의미); 마우스;

는, 나는이 기능 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' 
) 

업데이트 :

당신은 수를 동물 내가 제약

+2

이렇게하지 마십시오. 한 문자로 여러 값을 구분하여 저장하지 마십시오. 데이터베이스 정규화에 대해 읽어보십시오. 이 길을 내려 가지 마라. –

답변

1

앞에 추가 문자열 구분 기호는 다음과 같이 일치를 적용 열입니다 두 번째 테이블 (외래 키 참조 포함) 또는 중첩 테이블을 사용하십시오.

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 

16,은 그럼 당신은 할 수 있습니다 :

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 
+0

답변 해 주셔서 감사합니다. 하지만 난 값 null 또는 값을 삽입 할 수있는 가능성을 가지고 나타 내기 위해 ommitted있다. 나는이 regexp_like (';'|| categories, '^ (; cat | the mouse | 개 앵무새 | null | |) \ s *) * $', ' 나는'). 하지만 이제 null을 삽입 할 수 있습니다. – van

+0

@VannessaKemeni 오라클의'NULL'과 빈 문자열은 똑같은 것이므로 다음과 같이 할 수 있습니다 :'CHECK (animal is NULL or REGEXP_LIKE (...)))' – MT0

+0

정말로 : 나는 제약 조건을 추가합니다. 동물은 null입니다. 그러나 꼭 필요한 경우 'null'값을 삽입하면 작동하지 않습니다. 그래서이 값을 regexp_like (...)에 추가했습니다. – van

0

, 나는이 데이터를 조작 필요로하지 않는 간단한 유효성 검사 정규식 (주 믿는다 ';'뒤에 공백이 있음)

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