programing

LIKE가 없는 Oracle 문자열에서 하위 문자열 확인

lastcode 2023. 7. 1. 08:45
반응형

LIKE가 없는 Oracle 문자열에서 하위 문자열 확인

오라클에서 LIKE를 사용하지 않고 문자열의 하위 문자열을 확인하려면 어떻게 해야 합니까?예를 들어 성에 "z"가 있는 모든 사용자를 테이블에서 선택하려고 합니다.

SELECT * FROM users WHERE last_name LIKE '%z%';

그렇게 하면 좋겠지만, LIKE는 사용하고 싶지 않습니다.제가 사용할 수 있는 다른 기능이 있나요?

당신이 요구하는 이유는 공연 때문인 것 같아요?여기에 instr 기능이 있습니다.하지만 그것은 막후에서도 거의 똑같이 작동할 가능성이 높습니다.

전체 텍스트 검색을 조사할 수도 있습니다.

마지막 리조트로는 캐싱 또는 사전 계산된 열/인덱스 뷰를 볼 수 있습니다.

'z'에만 관심이 있다면 함수 기반 인덱스를 만들 수 있습니다.

CREATE INDEX users_z_idx ON users (INSTR(last_name,'z'))

그러면 당신의 질문은WHERE INSTR(last_name,'z') > 0.

이 방법을 사용하면 검색하려는 각 문자에 대해 별도의 인덱스를 만들어야 합니다.이것이 당신이 자주 하는 일이라면, 각 글자에 대해 하나의 색인을 만드는 것이 가치가 있을 것이라고 생각합니다.

또한 데이터의 이름이 표준 방식(예: "Zaxxon")으로 대문자로 표시된 경우에는 예제와 내 예제가 모두 Z로 시작하는 이름과 일치하지 않습니다.검색 표현식에 LOWER를 포함하여 이 문제를 수정할 수 있습니다.INSTR(LOWER(last_name),'z').

INSTR을 사용하여 이 작업을 수행할 수 있습니다.

SELECT * FROM users WHERE INSTR(LOWER(last_name), 'z') > 0;

INSTR은 하위 문자열이 문자열에 없으면 0을 반환합니다.

관심에서, 왜 당신은 좋아요를 사용하고 싶지 않습니까?

편집: 밥 제비디를 놓치지 않도록 제가 실례를 무릅쓰고 검색 케이스를 둔감하게 만들었습니다. :-)

데이터베이스는 일반적인 사용 시나리오에 매우 최적화되어 있으며 LIKE도 그 중 하나입니다.

DB 수준을 유지하려면 더 빠른 검색 방법을 찾을 수 없습니다.

술어와 일치하는 행이 포함된 블록 수가 테이블의 총 블록 수보다 현저히 적은 경우에는 전체 테이블 검색 이외의 다른 항목을 사용하여 이러한 값을 찾는 것이 좋습니다.그렇기 때문에 사용자가 LIKE '%x%'를 사용할 때 전체 검색을 위해 Oracle이 인덱스 사용을 거부하는 경우가 많습니다. 여기서 x는 매우 작은 문자열입니다.예를 들어 최적화 도구가 인덱스를 사용하면 테이블 블록의 20%에서 단일 블록 읽기가 여전히 필요하다고 생각하는 경우 전체 테이블 검색이 인덱스 검색보다 더 나은 옵션일 수 있습니다.

때때로 최적화 도구가 추정할 수 있는 것보다 술어가 훨씬 더 선택적이라는 것을 알 수 있습니다.이러한 경우 관련 열에 대해 인덱스 고속 전체 스캔을 수행하기 위해 최적화 도구 힌트를 제공하는 방법을 검토할 수 있습니다(특히 인덱스가 테이블보다 훨씬 작은 세그먼트인 경우).

SELECT /*+ index_ffs(users (users.last_name)) */
       * 
FROM   users
WHERE  last_name LIKE "%z%"

REGEXP_INSTR 함수를 사용해 보십시오.

언급URL : https://stackoverflow.com/questions/1571957/check-for-a-substring-in-a-string-in-oracle-without-like

반응형