17 / 17 / 0
Регистрация: 26.02.2013
Сообщений: 506

SQLite3 - Как найти ДВЕ подстроки в строке из базы?

15.08.2023, 22:39. Показов 2040. Ответов 16

Студворк — интернет-сервис помощи студентам
Приветствую, всезнающий All !

Вопрос такой возник: есть заполненная база в SQLite3 и список из двух и более подстрок: ['абс', 'cde', ...].
Нужна выборка записей из базы, в которых бы поле скажем 'name' содержало бы одну или более искомых подстрок.
Как это в запрос прописать: "SELECT instr(name, ???)", где вместо ??? можно вставить свою функцию с помощью con.create_function() и SELECT из нее - или вообще не туда копаю ? Посоветуете чего ?
Спасибо.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.08.2023, 22:39
Ответы с готовыми решениями:

Даны две строки. Необходимо найти длину самой длинной подстроки, одинаковой в каждой строке
Даны две строки (s1 и s2). Необходимо найти длину самой длинной подстроки, одинаковой в каждой строке. Подстрока должна быть найдена самой...

Найти длину максимальной подстроки, такой что в этой подстроке не существует подстроки равной какой-то строке
Не могу решить задачу, я понял саму задачу. Не могу написать код, помогите, плз! У Дроида-На2а есть строка S, и K строк ai. Ваша задача...

Как найти все подстроки в строке?
Как найти все подстроки в строке, а не только одну?

16
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
16.08.2023, 22:53
это оператор LIKE
https://metanit.com/sql/sqlite/4.2.php

Добавлено через 3 минуты
для двух подстрок как то так
SQL
1
SELECT FROM tbl WHERE name LIKE 'Вася' OR name LIKE 'Пупкин'
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
17.08.2023, 10:17
Лучший ответ Сообщение было отмечено BVladimir2 как решение

Решение

Есть правильный и неправильный способ. Вот правильный с кодогенерацией:

Python
1
2
3
4
5
lst = ['абс', 'cde']
assert len(lst) > 0
sql = 'SELECT * FROM distro WHERE name IN ({})'.format(', '.join('?' * len(lst)))
 
result_set = cursor.execute(sql, *lst)
Добавлено через 9 минут
А, несколько не понял задание. Ну, СУБД для того и создана, чтобы работать с данными.

Python
1
2
3
4
5
6
lst = ['абс', 'cde']
assert len(lst) > 0
lst2 = [f'%{i}%' for i in lst]
sql = 'SELECT * FROM distro WHERE {}'.format(' or '.join(['name like ?'] * len(lst2)))
 
result_set = cursor.execute(sql, *lst2)
2
17 / 17 / 0
Регистрация: 26.02.2013
Сообщений: 506
17.08.2023, 11:43  [ТС]
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
1
2
3
4
5
6
lst = ['абс', 'cde']
assert len(lst) > 0
lst2 = [f'%{i}%' for i in lst]
sql = 'SELECT * FROM distro WHERE {}'.format(' or '.join(['name like ?'] * len(lst2)))
result_set = cursor.execute(sql, *lst2)

У меня может быть быть список списков с подстроками, а запрос хотелось бы один сделать, а не на каждый список подстрок
генерировать свой запрос. Есть варианты ?
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
17.08.2023, 11:49
Цитата Сообщение от BVladimir2 Посмотреть сообщение
Есть варианты ?
Есть. Переделай в список строк, делов-то.
0
17 / 17 / 0
Регистрация: 26.02.2013
Сообщений: 506
17.08.2023, 14:11  [ТС]
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Есть. Переделай в список строк, делов-то.
Это как ? У меня [ ['abc', 'def', ...],
['ghi', 'jfk', ...],
... ]
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
17.08.2023, 14:12
Да цикл в цикле и заполняешь новый плоский список.
0
17 / 17 / 0
Регистрация: 26.02.2013
Сообщений: 506
17.08.2023, 15:59  [ТС]
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Да цикл в цикле и заполняешь новый плоский список.

Сначала: у меня к примеру 100 списков (фамилий) в каждом из которых по 1, 2 и более подстрок типа: ['иванов', 'иванович', 'петр', '1980'], мне нужно найти в базе все элементы в которых бы name типа: 'иванов иван иванович тел.: 111-22-33' содержал бы 1 или более подстрок из любого из 100 списков. Т.е. в этом примере будет два совпадения: 'иванов' и 'иванович', соответственно запись с этим name подходит... Как мне один общий запрос тогда делать ?
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
17.08.2023, 16:01
Было уже написано выше.
0
17 / 17 / 0
Регистрация: 26.02.2013
Сообщений: 506
17.08.2023, 16:04  [ТС]
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Было уже написано выше.
Не понимаю, как может тут помочь плоский список - тут как раз каждый список это набор полей для поиска конкретной записи. А общий список даст вообще все записи...
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
17.08.2023, 16:09
Ну так сделай тогда 100 запросов к БД
0
17 / 17 / 0
Регистрация: 26.02.2013
Сообщений: 506
17.08.2023, 16:12  [ТС]
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Ну так сделай тогда 100 запросов к БД
Ну если вариантов нет, то так и придется делать. Но неужели же нет возможности это одним запросом решить пусть хоть с подзапросами ?
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
17.08.2023, 16:24
Можно, но это глупо. Весь этот тред звучит глупо.

SQL
1
2
3
4
5
SELECT * FROM distro WHERE name LIKE '%иванов%' OR name LIKE '%иванович%' OR name LIKE '%петр%' OR name LIKE '%1980%'
UNION ALL
SELECT * FROM distro WHERE name LIKE '%иванов2%' OR name LIKE '%иванович2%' OR name LIKE '%петр2%' OR name LIKE '%1980%'
UNION ALL
--…
2
17 / 17 / 0
Регистрация: 26.02.2013
Сообщений: 506
17.08.2023, 16:42  [ТС]
Теперь понял, спасибо ! А почему глупо то ? Разве один общий запрос пусть и такой не быстрее будет чем 100 запросов ?
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
17.08.2023, 18:31
Цитата Сообщение от BVladimir2 Посмотреть сообщение
не быстрее будет чем 100 запросов
не факт - нагрузка на БД больше
люди с опытом такие фильтрации делают на клиенте то есть - запрос типа
SQL
1
SELECT * FROM tbl WHERE name LIKE '%abc%';
получаете таблицу и фильтруете как вам надо
1
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
17.08.2023, 19:34
Цитата Сообщение от vic5710 Посмотреть сообщение
не факт - нагрузка на БД больше
Будь это знакома я мне СУБД, я бы мог порассуждать про кеширование плана запроса и ещё чем-нибудь подобным.

Но в любом случае из-за множественных like будет делаться full scan таблицы, так что работать будет относительно медленно. Но всё равно быстрее, чем тащить на клиент многие мегабайты данных, а потом ворочать их неторопливо на питоне.
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
17.08.2023, 20:05
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Но всё равно быстрее, чем тащить на клиент многие мегабайты данных
одно время часто бывал на sql.ru, там мне все время говорили, когда делал сложные запросы - БД для скачки данных, обработка на клиенте
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.08.2023, 20:05
Помогаю со студенческими работами здесь

Ввести с клавиатуры строку. Найти шаблон во введенной строке (поиск подстроки в строке)
Помогите написать программу. Ввести с клавиатуры строку. Ввести с клавиатуры коротенькую строку - шаблон. Найти шаблон во введенной строке....

Как восстановить или извлечь данные из повреждённой базы данных SQLite3?
Здравствуйте, на андроиде случился сбой, из-за чего удалилось множество системных файлов, в том числе - записи с блокнота в формате sqlite....

Найти все подстроки в строке
Есть строка, следующего вида: ...<div class="b-list__item"><a href="/world/20170129/1486716177.html"><span...

Найти позицию подстроки в строке
привет всем, с вами снова изобретатель велосипедов :) на сей раз я решил изобрести поиск подстроки в строке, немного не выходит,...

Найти индекс подстроки в строке
Функция strindex должна возвращать позицию (индекс) начала строки t в строке s или -1 если t нет в s, но почемуто всегда получаю -1; int...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

Новые блоги и статьи
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определенном условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru