source

숫자만 포함할 문자열 제약 조건을 확인합니다. (Oracle SQL)

nicesource 2023. 8. 17. 21:27
반응형

숫자만 포함할 문자열 제약 조건을 확인합니다. (Oracle SQL)

PROD_NUM과 같이 0으로 패딩된 '숫자'가 포함된 열이 있습니다.예를 들어 001004569입니다.그들은 모두 9자입니다.

숫자에 대한 일반적인 작업이 이러한 "숫자"에서 의미가 없기 때문에 숫자 유형을 사용하지 않습니다(예: PROD_NUM * 2는 의미가 없습니다).그리고 길이가 모두 같기 때문에 열은 CHAR(9)로 정의됩니다.

CREATE TABLE PRODUCT (
    PROD_NUM CHAR(9) NOT NULL
    -- ETC.
)

PROD_NUM을 9자리만 포함할 수 있도록 제한하고 싶습니다.공백 없음, '0'에서 '9' 이외의 문자 없음

REGEXP_LIKE(PROD_NUM, '^[[:digit:]]{9}$')

현재 경로를 계속 진행하는 방법에 대한 몇 가지 좋은 답변을 이미 받았습니다.다른 경로를 제안하겠습니다. 대신 숫자(9,0) 데이터 유형을 사용하십시오.

이유:

  • 실수가 포함되어 있는지 확인하기 위해 추가 검사 제약 조건이 필요하지 않습니다.

  • 당신은 옵티마이저를 속이는 것이 아닙니다.예를 들어, "BETWEEN '0000009'와 '000000010'은 몇 개의 prod_num입니까?"거기에는 많은 문자열들이 들어맞습니다.반면 "prod_num between 9 and 10"은 분명히 두 개의 숫자만 선택합니다.추기경들은 더 나아지고, 더 나은 실행 계획으로 이어질 것입니다.

  • 당신은 당신의 코드를 유지해야 하는 미래의 동료들을 속이는 것이 아닙니다.이름을 "prod_num"으로 지정하면 자동으로 숫자가 포함된 것으로 간주됩니다.

응용프로그램은 lpad(to_char(prod_num),9,0')를 사용할 수 있습니다.

안녕, 롭.

(MH에 의한 업데이트) 의견 스레드에는 이 접근 방식에 대해 고려해야 할 다양한 사항을 잘 보여주는 토론이 있습니다.만약 이 주제가 흥미롭다면 당신은 그것들을 읽어야 합니다.

모든 버전에서 작동:

TRANSLATE(PROD_NUM,'123456789','000000000') = '000000000'

코드벤더의 regexp는 잘 작동할 것 같은데 조금 느린 것 같습니다.

할 수 있습니다(테스트되지 않음).

replace(변환(prod_num, '0123456789', 'NNNNNNNN', 'N', null)이 null입니다.

정수로 캐스팅하고 다시 바르샤르로 캐스팅한 후 원래 문자열과 동일한지 확인하시겠습니까?

MSSQL에서 제약 조건 테스트로 다음과 같은 것을 사용할 수 있습니다.

PROD_NUM NOT LIKE '%[^0-9]%'

저는 오라클 사람은 아니지만 괄호로 묶은 문자 목록은 지원하지 않는 것 같습니다.

MS SQL 서버에서 나는 다음 명령을 사용합니다: alter table add constraint [cc_mytable_myfield] 체크 (캐스트(myfield as bigint) > 0)

성능은 확실하지 않지만 범위를 알면 다음과 같이 작동합니다.DDL을 생성할 때 CHECK 제약 조건을 사용합니다.

alter table test add jz2 varchar2(4)
     check ( jz2 between 1 and 2000000 );

뜻대로

alter table test add jz2 varchar2(4)
     check ( jz2 in (1,2,3)  );

이것도 효과가 있을 것입니다.

alter table test add jz2 varchar2(4)
         check ( jz2 > 0  );

언급URL : https://stackoverflow.com/questions/1167767/check-constraint-of-string-to-contain-only-digits-oracle-sql

반응형