programing

SQLite에서 Oracle INSTR 교체

oldcodes 2023. 7. 23. 14:41
반응형

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

학점

  1. 긍정적인position방법은 Tim Biegeleisen의 답변에서 채택되었습니다. (그러나 0 값은 별도로 처리해야 합니다.)
  2. 네거티브position메소드는 이 질문에서 설명한 메소드를 시작점으로 사용했습니다.
  3. 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

반응형