SQLite에서 Oracle INSTR 교체
현재 애플리케이션의 일부를 Oracle에서 SQLite 백엔드(Java, 일반 JDBC 사용)로 이식하고 있습니다.자주 사용되는 Oracle 관련 기능 중 하나는 세 가지 인수가 있는 INSTR 함수입니다.
INSTR(<string>, <search-string>, <position>)
이 함수는 문자열 내에서 특정 위치에서 시작하는 검색 문자열을 검색합니다.세 번째 모수는 양수 또는 음수일 수 있습니다.음수일 경우 검색은 문자열 끝에서 시작하여 역방향으로 작동합니다.
이 기능은 SQLite에서 사용할 수 없으며 다른 기능을 중첩하여 사용하는 방법이 가장 좋습니다.
<position>이 양의 경우:
LENGTH(<string>) - LENGTH(Substr(<string>, <position>), STRPOS(Substr(<string>, <position>), <search-string>) + 1)
<position>이 음수인 경우(이 경우 -1만 음수 값이 사용됨):
Length(<string>) - Length(REPLACE(<string>, RTRIM(<string>, RTRIM(<string>, REPLACE(<string>, <search-string>, ''), ''))
이것은 원하는 결과를 제공하는 것처럼 보이지만, 왜 제가 이 접근법에 찬성하지 않는지 알 수 있습니다.원래 구문에서 INSTR이 많이 사용되고 중첩되어 있기 때문입니다.나중에 유지보수에 문제가 됩니다.
좀 더 우아한 접근법이 있습니까? 아니면 다소 사소한 작업으로 보이는 다른 기본 솔루션을 놓칠 수 있습니까?
SQL
CASE WHEN position = 0
THEN INSTR(string, substring)
WHEN position > 0
THEN INSTR(SUBSTR(string, position), substring) + position - 1
WHEN position < 0
THEN LENGTH(RTRIM(REPLACE(string,
substring,
REPLACE(HEX(ZEROBLOB(LENGTH(substring))),
'00',
'¬')),
string)) - LENGTH(substring) + 1
END
그것은 다음을 가정합니다.¬
문자는 검색 문자열의 일부가 되지 않습니다(그러나 가능하지 않은 경우 이 가정은 물론 거의 사용되지 않는 다른 문자로 변경될 수 있습니다).
SQL 중간 데모
여기에 적용된 몇 가지 예제: http://sqlfiddle.com/ #!5/7e40f9/5
학점
- 긍정적인
position
방법은 Tim Biegeleisen의 답변에서 채택되었습니다. (그러나 0 값은 별도로 처리해야 합니다.) - 네거티브
position
메소드는 이 질문에서 설명한 메소드를 시작점으로 사용했습니다. - n번 반복되는 문자로 구성된 문자열을 만드는 것은 이 단순화된 답변에서 따왔습니다.
실제로 SQLite는 기능을 지원합니다.그러나 세 번째 매개 변수가 없습니다. 즉, 항상 문자열의 맨 처음부터 검색합니다.
하지만 하위 문자열을 에 전달하여 이 문제를 해결할 수 있습니다.INSTR
그런 다음 부분 문자열의 오프셋 양을 추가하여 찾은 위치를 오프셋합니다.
예를 들어 Oracle의 요청은 다음과 같습니다.
INSTR('catsondogsonhats', 'on', 7)
다시 돌아올 것입니다.11
다음이 될 것입니다.
INSTR(SUBSTR('catsondogsonhats', 7), 'on') + 6
언급URL : https://stackoverflow.com/questions/56322407/oracle-instr-replacement-in-sqlite
'programing' 카테고리의 다른 글
Oracle 시간대가 있는 TIMESTAMP를 DATE로 변환 (0) | 2023.07.28 |
---|---|
Python 요청 라이브러리 새 URL 리디렉션 (0) | 2023.07.23 |
사전 승인 주석의 Java 8/Spring 상수 (0) | 2023.07.23 |
런타임 경고: 분할에서 잘못된 값이 발견되었습니다. (0) | 2023.07.23 |
java에서 oracle sql 스크립트 실행 (0) | 2023.07.23 |