Эффективный поиск подстрок в SQL [Python / SQLite] - PullRequest
1 голос
/ 17 июня 2019

У меня есть две таблицы SQLite (list1 и list2), каждая из которых содержит только один текстовый столбец (val).Я хочу эффективно искать все комбинации, где list2.value может быть подстрокой в ​​list1.value.

В настоящее время у меня есть такое решение:

import sqlite3

list1 = ["this is string1", "this is string2", "this is string3"]
list2 = ["string1", "string2"]

in_memory = sqlite3.connect(':memory:')
c = in_memory.cursor()
c.execute('CREATE TABLE list1 (val text NOT NULL)')
c.execute('CREATE TABLE list2 (val text NOT NULL)')

for v in list1:
    c.execute("INSERT INTO list1 VALUES (?)", (v, ))

for v in list2:
    c.execute("INSERT INTO list2 VALUES (?)", (v, ))

l = [*c.execute("SELECT list1.val, list2.val FROM list1, list2 WHERE instr(list1.val, list2.val)")]
print(l)

Печатает правильно:

[('this is string1', 'string1'), ('this is string2', 'string2')]

Существует ли более эффективное решение SQL, чем повторение для каждого list1.val и list2.valсочетание и поиск, если есть подстрока?

1 Ответ

2 голосов
/ 17 июня 2019

Вы можете сформулировать это как один запрос:

select l1.value, l2.value
from list1 l1 join
     list2 l2
     on l1.val like '%' || l2.val || '%';

Выполнение цикла внутри базы данных несколько более эффективно, чем выполнение цикла самостоятельно - потому что возвращаются только совпадающие строки, а у вас нетнакладные расходы на несколько запросов.

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

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