programing

중괄호와 와일드카드를 사용한 Oracle 텍스트 이스케이프

starjava 2023. 7. 6. 21:44
반응형

중괄호와 와일드카드를 사용한 Oracle 텍스트 이스케이프

다음을 사용하여 Oracle 텍스트 쿼리의 검색 기준에서 벗어날 수 있습니다.contains그리고 이스케이프된 기준을 와일드카드와 결합하여 "잘못 잘라낸" 기준을 가집니다.(내 인덱스가 이상적인 성능을 위해 설정되지 않았을 수도 있지만, 그것은 불필요합니다.)나는 최상의 가독성을 위해 곱슬곱슬한 중괄호 구문을 사용할 수 있기를 원하지만 이것은 작동하지 않습니다.이와 관련된 질문(중복되지 않음)에 대한 상위 답변에 따르면 곱슬곱슬한 괄호는 전체 토큰을 정의합니다.이 동작을 비활성화하거나 해결할 방법이 있습니까?

오라클 텍스트: 사용자 입력을 검사하는 방법

예약된 단어도 "특수"로 간주되기 때문에 검색 기준의 모든 문자를 이스케이프하거나 문자열에서 특수 문자를 검색하려고 시도하지 않습니다. (중지 단어가 없습니다.)다음은 저의 문제를 보여줍니다.(불행히도 SQLFiddle은 Oracle 텍스트를 지원하지 않는 것 같습니다.)

create table MY_TABLE(MY_COL varchar2(20));
insert into MY_TABLE(MY_COL) values ('abc');
insert into MY_TABLE(MY_COL) values ('abcd');
insert into MY_TABLE(MY_COL) values ('abcde');
insert into MY_TABLE(MY_COL) values ('bcd');
insert into MY_TABLE(MY_COL) values ('bcde');

create index FTIX on MY_TABLE (MY_COL)
indextype is CTXSYS.CONTEXT
PARAMETERS ('STOPLIST CTXSYS.EMPTY_STOPLIST SYNC (ON COMMIT)');

select * from MY_TABLE where CONTAINS(MY_COL, '%bcd%') > 0; --expected results
select * from MY_TABLE where CONTAINS(MY_COL, '%{bcd}%') > 0; --no results
select * from MY_TABLE where CONTAINS(MY_COL, '{bcd}') > 0; --returns bcd
select * from MY_TABLE where CONTAINS(MY_COL, '{%bcd%}') > 0; --returns bcd
select * from MY_TABLE where CONTAINS(MY_COL, '%\b\c\d%') > 0; --expected results

어때요?

select * from MY_TABLE where CONTAINS(MY_COL, regexp_replace('*abc*', '([^*])', '\\\1')) > 0

언급URL : https://stackoverflow.com/questions/30194480/oracle-text-escaping-with-curly-braces-and-wildcards

반응형