Строка соответствия всем возможным подстрокам строки - PullRequest
0 голосов
/ 31 октября 2019

Я пытаюсь оптимизировать запрос с подстрокой в ​​нем. Допустим, у меня есть таблица, содержащая это:

id   | code    | value
1    | A       | "this is a"
2    | AB      | "this is a and b"
3    | ABC     | "this is a,b and c"
4    | ABCD    | "this is a b c and d"
5    | ABCE    | "this is a b c and E, not D"
6    | Z       | "this is z"
7    | ZZ      | "this is zz"
8    | ZZZ     | "this is triple z"

См .: http://sqlfiddle.com/#!9/295c25/1

Код является возрастающей строкой, от 1 до 16 символов. Моя таблица содержит миллион строк.

Я хочу написать оператор SQL: введите код любой длины, и он возвращает все строки, соответствующие иерархии кода.

Пример:

input code = "A",  it returns "A"
input code = "ABCD", it returns "A", "AB", "ABC" and "ABCD"
input code = "ABCX", it returns "A", "AB", "ABC"
input code = "ZZZZZZ", it returns "Z", "ZZ", "ZZZ"

При первой попытке я сделал что-то вроде

select * from data D
where :mycode: like concat(D.code, '%')

Он работает нормально, но с миллионом строк CONCAT выдает результат сканирования таблицы и слишком медленный для моего приложения.

Затем я модифицирую запрос так, чтобы он выглядел примерно так:

select * from data D
where D.code in (
  susbtring(:code:,1,1),
  susbtring(:code:,1,2),
  susbtring(:code:,1,3),
  susbtring(:code:,1,4)
)

Сканирование минимально, и оно прекрасно работает, но у меня есть интуиция, я мог бы написать лучший и более простой запрос.

Есть ли способ использовать в операторе IN () все подстроки строки, от 1-го символа до последнего символа?

Мне бы хотелось, чтобы запрос был таким:

select * from data D
where D.code in ( 
   -- I dont know how to write this part
   select substrings(1..length(:code:))
)

Спасибо вам всем гуру БД!

Джером

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...