Sqlite: Sql для поиска наиболее полного префикса - PullRequest
0 голосов
/ 07 августа 2009

У меня есть таблица sqlite, содержащая записи с префиксами чисел переменной длины. Я хочу найти наиболее полный префикс для другого номера переменной длины наиболее эффективным способом:

например. Таблица содержит столбец с именем prefix со следующими номерами:

1. 1234
2. 12345
3. 123456

Какой эффективный запрос sqlite для нахождения второй записи является наиболее полным совпадением с 12345999.

Спасибо.

Ответы [ 5 ]

6 голосов
/ 07 августа 2009

Аккуратный трюк здесь в том, чтобы перевернуть предложение LIKE, а не сказать

WHERE prefix LIKE '...something...'

Как вы часто делаете, включите префикс в шаблон, добавив% к концу и сравнив его с вашим вводом в качестве фиксированной строки. Сортируйте по длине префикса по убыванию и выберите лучший результат 1.

Я никогда раньше не использовал Sqlite, но только что скачал его, и это прекрасно работает:

sqlite> CREATE TABLE whatever(prefix VARCHAR(100));
sqlite> INSERT INTO WHATEVER(prefix) VALUES ('1234');
sqlite> INSERT INTO WHATEVER(prefix) VALUES ('12345');
sqlite> INSERT INTO WHATEVER(prefix) VALUES ('123456');
sqlite> SELECT * FROM whatever WHERE '12345999' LIKE (prefix || '%') 
        ORDER BY length(prefix) DESC LIMIT 1;

выход:

12345
1 голос
/ 07 декабря 2009

Лично я использую следующий метод, он будет использовать индексы:

оператор '(' 1 ',' 12 ',' 123 ',' 1234 ',' 12345 ',' 123459 ',' 1234599 ',' 12345999 ',' 123459999 ')' должен быть сгенерирован клиентом

SELECT * FROM whatever WHERE prefix in
('1','12','123','1234','12345','123459','1234599','12345999','123459999')
ORDER BY length(prefix) DESC LIMIT 1;
1 голос
/ 09 августа 2009

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

Выполните запрос LIKE для каждого возможного префикса, начиная с самого длинного. Остановитесь, как только вы вернете строки.

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

1 голос
/ 07 августа 2009

пара предположений.

  1. вы объединяетесь с какой-то другой таблицей, поэтому вы хотите знать префикс наибольшей переменной длины для каждой записи в таблице, с которой вы соединяетесь.
  2. Ваша таблица префиксов на самом деле больше, чем просто три, которые вы указываете в своем примере ... в противном случае вы можете жестко закодировать логику и двигаться дальше.
prefix_table.prefix
1234
12345
123456
etc.

foo.field
12345999
123999

  select
   a.field,
   b.prefix,
   max(len(b.prefix)) as length
  from
   foo a inner join prefix_table b on b.prefix = left(a.field, len(b.prefix))
  group by
   a.field,
   b.prefix

обратите внимание, что это не проверено, но логически должно иметь смысл.

1 голос
/ 07 августа 2009
select foo, 1 quality from bar where foo like "123*"
union
select foo, 2 quality from bar where foo like "1234*"
order by quality desc limit 1

Я не проверял это, но идея будет работать на других диалектах SQL

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