숫자만 포함할 문자열 제약 조건을 확인합니다. (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
'source' 카테고리의 다른 글
두 앱을 MariaDB Multi Master 데이터베이스에 연결합니다. (0) | 2023.08.22 |
---|---|
SQL 쿼리에 대한 지원이 필요하고 오류 메시지가 표시됨 하위 쿼리가 하나 이상의 행을 반환함 (0) | 2023.08.17 |
jQuery를 사용하여 URL 변경 및 리디렉션 (0) | 2023.08.17 |
나는 파이썬으로 바이낸스 데이터를 스트리밍하고 있지만 내 mariadbdb에 삽입하면 가격이 반올림됩니다. (0) | 2023.08.17 |
약속 함수에 매개 변수를 전달하는 방법 (0) | 2023.08.17 |