Замена Oracle INSTR в SQLite - PullRequest
13 голосов
/ 27 мая 2019

В настоящее время я портирую часть приложения из Oracle на сервер SQLite (Java, используя обычный JDBC).Одной из часто используемых специфических функций Oracle является функция INSTR с тремя аргументами:

INSTR (,, )

Эта функция ищет в строке строку поиска, начиная с определенной позиции.Третий параметр может быть как положительным, так и отрицательным.Если оно отрицательное, поиск работает в обратном направлении, начиная с конца строки.

Эта функция недоступна в SQLite, и лучшее, что я мог бы придумать, - это альтернатива вложением некоторых других функций:

Если положительно:

ДЛИНА () - ДЛИНА (SUBSTR (SUBSTR (, )), STRPOS (SUBSTR(, ),) + 1))

Если отрицательно (в нашем случае -1 используется только отрицательное значение):

ДЛИНА () - ДЛИНА (ЗАМЕНА (, RTRIM (), ЗАМЕНА (,, '')), ''))

Кажется, это дает желаемый результат, но вы можете понять, почему я не очень поддерживаю такой подход.Конечно, потому что в оригинальном синтаксисе INSTR используется часто и также является вложенным.Впоследствии это становится катастрофой для техобслуживания.

Есть ли более элегантный подход, или я могу упустить какое-то другое нативное решение для того, что кажется довольно тривиальной задачей?

Ответы [ 2 ]

6 голосов
/ 30 мая 2019

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

Предполагается, что символ ¬ не будет частью строки поиска (но в маловероятном случае это предположение ложно, конечно, можно изменитьк другому редко используемому символу).

Демонстрация SQLFiddle

Некоторые примеры работы здесь: http://sqlfiddle.com/#!5/7e40f9/5

Кредиты

  1. Положительный метод position был адаптирован из ответа Тима Бигелайзена.(Но нулевое значение необходимо обрабатывать отдельно).
  2. Отрицательный метод position использовал метод, описанный в этом вопросе, в качестве отправной точки.
  3. Создание строки, состоящей изповторяющийся символ n раз был взят из этого упрощенного ответа .
5 голосов
/ 27 мая 2019

На самом деле SQLite поддерживает функцию INSTR.Но у него нет третьего параметра, что означает, что он всегда ищет с самого начала строки.

Но мы можем обойти это, передав подстроку в INSTR, а затем сместив позициюопределяется путем добавления величины смещения подстроки.

Так, например, вызов Oracle:

INSTR('catsondogsonhats', 'on', 7)

, который будет возвращать 11, станет:

INSTR(SUBSTR('catsondogsonhats', 7), 'on') + 6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...