programing

Oracle - 필드에 소문자가 있는 위치를 선택합니다.

minimums 2023. 6. 27. 22:02
반응형

Oracle - 필드에 소문자가 있는 위치를 선택합니다.

Oracle 9.2.0.6 데이터베이스에 사용자 테이블이 있습니다.필드 중 두 개는 varchar(last_name 및 first_name)입니다.

행을 이 테이블에 삽입할 때 이름과 성 필드는 모두 대문자여야 하지만, 이 두 필드의 일부 값은 대소문자가 혼합되어 있습니다.

테이블에 소문자가 있는 이름 또는 성이 있는 모든 행을 표시하는 쿼리를 실행하려고 합니다.

인터넷을 검색해보니 REGEXP_LIKE가 나왔는데, 그것은 새로운 버전의 오라클용임에 틀림없습니다. 저에게는 안 맞는 것 같습니다.

제가 시도한 또 다른 것은 "abcde..."를 번역하는 것이었습니다.z"에서 "$$$$$$...그런 다음 내 필드에서 '$'를 검색합니다. 하지만 더 나은 방법이 있어야 합니까?

잘 부탁드립니다!

이거 어때:

select id, first, last from mytable
where first != upper(first) or last != upper(last);

BQ의 SQL과 Justin의 두 번째 SQL이 작동할 것으로 생각합니다. 왜냐하면 이 시나리오에서는 다음과 같습니다.

first_name        last_name
----------        ---------
bob               johnson
Bob               Johnson
BOB               JOHNSON

나는 내 쿼리가 처음 두 행을 반환하기를 원합니다.

하지만 저는 이것이 효율적인 질의가 될 것인지 확인하고 싶습니다. 제 테이블에는 5억 개의 행이 있습니다.

opper(first_name)!= first_name이라고 하면 "first_name"은 항상 Oracle이 보고 있는 현재 행과 관련이 있습니까?처음에는 이 방법을 사용하는 것이 두려웠습니다. 왜냐하면 제가 이 테이블을 스스로 연결할까봐 두려웠기 때문입니다. 하지만 두 분이 SQL을 작성한 방식은 동등성 검사가 행 단위로만 운영되고 있는 것 같습니다. 이것은 저에게 효과적일 것입니다.

Oracle 10g 이상을 찾는다면 아래의 예를 사용할 수 있습니다.열에 있는 모든 문자가 소문자인 행을 찾아야 합니다.

Column1
.......
MISS
miss
MiSS

위의 예제에서 값을 찾아야 하는 경우miss그리고.MiSS그런 다음 아래 쿼리를 사용할 수 있습니다.

SELECT * FROM YOU_TABLE WHERE REGEXP_LIKE(COLUMN1,'[a-z]');

사용해 보십시오.

SELECT * FROM YOU_TABLE WHERE REGEXP_LIKE(COLUMN1,'[a-z]','c'); => Miss, miss lower text
SELECT * FROM YOU_TABLE WHERE REGEXP_LIKE(COLUMN1,'[A-Z]','c'); => Miss, MISS upper text
 SELECT * 
 FROM mytable 
 WHERE FIRST_NAME IN (SELECT FIRST_NAME 
                      FROM MY_TABLE
                      MINUS 
                      SELECT UPPER(FIRST_NAME) 
                      FROM MY_TABLE )

DB colation 설정이 대소문자를 구분하지 않는 SQL 서버의 경우 다음을 사용합니다.

SELECT * FROM tbl_user WHERE LEFT(username,1) COLLATE Latin1_General_CS_AI <> UPPER(LEFT(username,1))

언급URL : https://stackoverflow.com/questions/317576/oracle-select-where-field-has-lowercase-characters

반응형