Рассмотрим следующую демонстрацию.
Временная таблица для тестирования:
CREATE TEMP TABLE nr(id int, nr numeric);
INSERT INTO nr VALUES
(1,1),(2,12),(3,13),(4,134),(5,135),
(6,136),(7,1362),(8,1363);
Запрос:
SELECT nr
FROM nr
WHERE '1362235' ~~ (nr::text || '%')
ORDER BY length(nr::text) DESC
LIMIT 1;
Доставляет самое длинное совпадение по запросу. Работа со строками (не числами) упрощает задачу. Вы можете изменить тип данных в своей таблице или привести значения в запросе, как я.
Если вам нужно, чтобы он был fast , измените тип на text
и индекс nr
. Подобный поиск может использовать простой индекс btree (по умолчанию) и будет очень быстрый.
CREATE INDEX nr_nr_idx ON nr (nr);
Если языковой стандарт вашей базы данных не 'C' или 'POSIX', используйте text_pattern_ops
, как прокомментировал @Gavin, или оператор LIKE
(~~
) не может использовать его даже для запуска столбца, поскольку порядок сортировки зависит от региона.
CREATE INDEX nr_nr_idx ON nr (nr text_pattern_ops);
Если вам нужен числовой тип столбца таблицы, есть еще один вариант. Используйте индекс для выражения , например, так:
CREATE INDEX nr_nr_idx ON nr ((nr::text) text_pattern_ops);
Приведенный выше запрос может использовать такой индекс, поскольку это выражение соответствует выражению индекса.