Я пытаюсь оптимизировать запрос с подстрокой в нем. Допустим, у меня есть таблица, содержащая это:
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:))
)
Спасибо вам всем гуру БД!
Джером