문제

배경

회사의 데이터베이스 개발 프로젝트에 대한 정보를 추적하는 응용 프로그램의 데이터베이스 디자인을 사용하고 있습니다. 프로젝트 관리 Office (PMO)는 프로젝트의 비용이 합병 통합을 위해 계산 된 경우 기반으로 각 프로젝트에 PSUEN 번호를 할당합니다. 설명하기 위해 할당 된 번호는 int (합병 통합에 기여한 프로젝트) 또는 nint (합병 통합에 기여하지 않음)로 시작합니다. 그런 다음 순차 번호가 할당됩니다. 예를 들어, int175 은 합병 통합에 기여하는 175 번째 프로젝트가 밝혀 질 것입니다. 추가 주름은 PMO가 때때로 "관련"과 동일한 수로 여러 프로젝트를 만들고 싶습니다. 예를 들어 int175 프로젝트, int175 b 프로젝트 등이있을 수 있습니다.

PMO 가이 숫자를 프로젝트의 식별자로 간주하는 동안 데이터베이스에서는 중복 프로젝트가 작성되지 않고 사용자의 검색 키로 만 열을 대체 고유 키로 사용할 수 있습니다. 해당 열에 대한 수표 제약 조건을 구현하여 위에서 준 규칙을 입력 할 수있는 규칙을 입력 할 수 있습니다.

내가 시도한 것 - 정규 표현식

나의 첫 번째 생각은 정규 표현을 사용하는 것이 었습니다. Oracle, Target DBMS에서는 사용할 수있는 regex_like 함수가 있습니다. 문서를 연구했습니다 ( 여기 , 여기서 , 여기서 , 여기 여기에 정규 표현식에 대한 )을 찾아서 어지럽게 할 옵션을 발견했습니다! 어떤 이유로 든 내 두뇌는 모든 다양한 패턴 일치 옵션 목록을 가져 와서 특정 예제에 적용하려고 노력하고 있습니다. 나는 그 예에서 가장 잘 일하는 사람들 중 하나입니다. 불행히도, 저는 많은 예제를 찾지 못했습니다. 내가 발견 한 것은 너무 간단했거나 너무 복잡해질 수 없었습니다.

내가 지금까지 시도한 것은 다음과 같습니다 :

select c
from (
  select 'INT1756b' c from dual union all
  select 'INT175a' c from dual union all
  select 'INT75a' c from dual union all
  select 'INT75' c from dual union all
  select 'NINT2283a' c from dual union all
  select 'NINT2283' c from dual union all
  select 'NINT915c' c from dual union all
  select 'NINT915' c from dual union all
  select 'NINT95b' c from dual union all
  select 'NINT95' c from dual union all
  select 'ABC123' c from dual
) x
where REGEXP_LIKE ( c, '(NINT|INT)\d{2}[0-9]|[a-z]' );
.

My Test "Table"X에는 유효한 숫자의 가능한 모든 조합의 예와 유효하지 않은 숫자의 가능한 모든 조합의 예로서 내가 예견하는 것입니다. 그들은 모두 int 또는 nint 로 시작한 다음 최대 2 개의 숫자를 최대 4 개의 숫자를 가져온 다음 선택적으로 끝 부분에서 소문자입니다. 내 투쟁 - 다양한 길이 취급

제가 정말로 어려움을 겪고있는 것은 숫자의 다양한 길이를 다루는 방법입니다. 2, 3 또는 3 또는 4 개의 숫자가있을 수 있으며, 이는 소문자로 이어질 수도 있고 그렇지 않을 수도 있습니다. 시동기와 마찬가지로 위의 것으로 오는 것은 int 또는 nint 후에 2 개의 숫자를 찾는 것이 었습니다. 항상 항상 에 적어도 두 개의 숫자가 될 것입니다. 그런 다음 나머지가 숫자 또는 소문자 세트에 있는지 확인합니다. 이제 저는 이것이 충분하지는 않지만 하루 종일 나의 두뇌를 건 드리는 두 사람 이후에 일어날 수 있습니다.

도움말을위한 plea!

오른쪽 방향으로 나를 가리킬 수있는 정규 표현식과 비슷한 것을 한 사람이 있거나 예를 보여주었습니다. 이 제약 조건을 구현할 수있는 더 우아하고 간단한 방법이 있습니까? 모든 도움과 포인터에 감사드립니다!

도움이 되었습니까?

해결책

이것은 실제로 데이터베이스 관리 질문이 아니라 ...

패턴은 다음과 같은 항목을 예방하지 않습니다. XXXINT123abogus는 "int"또는 "닌트"가 문자열의 시작 부분에 있어야합니다., 문자열의 마지막 상징이어야합니다.

다음과 같은 것을 시도 할 수 있습니다 :

 +----------------------------- begins with
 |+---------------------------- optional "N"
 ||  +------------------------- then "INT"
 ||  |  +---------------------- then digits
 ||  |  | +-------------------- minimum 2
 ||  |  | | +------------------ maximum 4
 ||  |  | | |   +-------------- then a lowercase letter
 ||  |  | | |   |  +----------- which is optional
 ||  |  | | |   |  |+---------- and nothing more
 ||  |  | | |   |  ||
 ||  |  | | |   |  ||
'^N?INT\d{2,4}[a-z]?$' 
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 dba.stackexchange
scroll top