Как искать по таблицe от 3 (трех) символов?
Есть таблица (справочник) и функция которая находит точное значение ячейки (работает).
Можно ли сделать (изменить) функцию чтобы она искала не точное значение а, к примеру, от 3 (трех) символов (букв)?
def select_last_name(message):
conn = sqlite3.connect(settings.DATABASE)
cursor = conn.cursor()
sql = "SELECT last_name, first_name, third_name, phone_v, phone_g, phone_m1, phone_m2 FROM dovidnyk WHERE last_name = ?"
query = message.text
query = query.title()
cursor.execute(sql, (query,))
result = cursor.fetchall()
if not result:
msg = 'Не нашол такую <b>{}</b> фамилию.'.format(message.text)
bot.send_message(message.from_user.id, msg, reply_markup=keyboard, parse_mode='HTML')
return
else:
for ln in result:
msg = "<i>? <u>ФИО</u></i>: <b>{} {} {}</b>\n" \
"<i>? <u>Тел. внутр.</u></i>: {}\n" \
"<i>☎️ <u>Тел. город.</u></i>: {}\n" \
"<i>? <u>Тел. моб. 1</u></i>: {}\n" \
"<i>? <u>Тел. моб. 2</u></i>: {}\n".format(ln[0], ln[1], ln[2], ln[3], ln[4], ln[5], ln[6])
bot.send_message(message.from_user.id, msg, reply_markup=keyboard, parse_mode='HTML')
Ответы (1 шт):
Автор решения: MaxU
→ Ссылка
Если нужен поиск по подстроке, то можно воспользоваться оператором LIKE:
def select_last_name(message):
# ...
# приводим подстроку поиска к нижнему регистру и обрамляем знаками процента
substring = "%{}%".format(message.text.casefold())
sql = """
SELECT last_name, first_name, third_name, phone_v, phone_g, phone_m1, phone_m2
FROM dovidnyk WHERE lower(last_name) like ?"""
cursor.execute(sql, (substring, ))
# ...
или функцией INSRT(...):
# ...
substring = message.text.casefold()
sql = """
SELECT last_name, first_name, third_name, phone_v, phone_g, phone_m1, phone_m2
FROM dovidnyk WHERE instr(lower(last_name), ?) > 0"""
cursor.execute(sql, (substring, ))
# ...