Oracle- 필드에 소문자가있는 곳을 선택하십시오
-
11-07-2019 - |
문제
Oracle 9.2.0.6 데이터베이스에 테이블, 사용자가 있습니다. 필드 중 2 개는 varchar -last_name 및 first_name입니다.
행 이이 테이블에 삽입되면 이름과 성 필드는 모든 대문자에 있어야하지만이 두 필드의 일부 값은 혼합 된 케이스입니다.
나는 소문자 문자가있는 이름을 가진 테이블 또는 성이있는 테이블의 모든 행을 보여줄 쿼리를 실행하고 싶습니다.
나는 그물을 검색하고 regexp_like를 찾았지만 그것은 새로운 버전의 Oracle을위한 것이어야합니다. 그것은 나에게 효과가없는 것 같습니다.
내가 시도한 또 다른 것은 "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
쿼리가 처음 2 행을 반환하기를 원합니다.
나는 이것이 효율적인 쿼리가 될 것인지 확인하고 싶습니다. 내 테이블에는 5 억 행이 있습니다.
상단 (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 mytable
WHERE FIRST_NAME IN (SELECT FIRST_NAME
FROM MY_TABLE
MINUS
SELECT UPPER(FIRST_NAME)
FROM MY_TABLE )
이 시도:
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
DB Collation 설정이 CASE 민감도 인 SQL Server의 경우 다음을 사용합니다.
SELECT * FROM tbl_user WHERE LEFT(username,1) COLLATE Latin1_General_CS_AI <> UPPER(LEFT(username,1))