regex_like를 사용하여 수표 제약 조건을 구현합니다
-
29-09-2020 - |
문제
배경
회사의 데이터베이스 개발 프로젝트에 대한 정보를 추적하는 응용 프로그램의 데이터베이스 디자인을 사용하고 있습니다. 프로젝트 관리 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]?$'
.