Какова верная реализация множественного выбора в SQLite через LIKE и REGEXP (Python)?

Ссылка скопирована
1 ответ

Использую SQLite в Python.
Нужно из БД выбрать все слова, начинающиеся с заглавной буквы.

Один из десятков перебранных вариантов:

Работает, но перечисление кучей LIKE всех букв алфавита выглядит печально:

cur.execute("SELECT * FROM list_words WHERE word LIKE 'А%' OR word LIKE 'Т%')").fetchall()

cur.execute("SELECT * FROM list_words WHERE word LIKE 'А%' OR word LIKE 'Т%')").fetchall()

Потому хочется что-то вроде такого:

cur.execute("SELECT * FROM list_words WHERE word REGEXP '[А*-Я*]'").fetchall()

cur.execute("SELECT * FROM list_words WHERE word REGEXP '[А*-Я*]'").fetchall()

- но получаю sqlite3.OperationalError: no such function: REGEXP

Можно как-то определить REGEXP для БД в Python, но использование сторонних пакетов для меня сомнительно, т.к. побаиваюсь бэкдоров ввиду крайне малого опыта в программировании, а в найденных документациях четких для себя инструкций не увидел.

Помогите решить проблему.

Дополнительно:

заглавные буквы идут в кодовых таблицах подряд. По идее, будет достаточно что-то типа:
WHERE substr(word, 1, 1) BETWEEN 'A' AND 'Z'
если таблица word меняется нечасто, добавь в неё отдельный столбец, содержащий первую букву, и сделай индекс по нему. Может значительно ускорить дело.

  • Спасибо

Ответы:

select word from list_words where substr(word,1,1)=upper(substr(word,1,1))

select word from list_words where substr(word,1,1)=upper(substr(word,1,1))

  • Блин. Мне такое даже в голову не пришло. X)
  • Vindicar, обычно средствами SQL так и проверяется. Но при желании можно и через regexp
    WHERE word REGEXP '^А-ЯЁA-Z'
    'Ё' нужно отдельно указывать, т.к. в диапазон А-Я не входит.
    Но при наличии upper как-то мало смысла в этом.
    Да и базово sqlite вроде regexp не поддерживает, его нужно отдельно ставить, или самому функцию создавать через re.
  • Спасибо! К сожалению, у меня не работает.
    Вариант (substr(word,1,5)=upper(substr(word,1,5))) тоже не срабатывает.
    Возможно потому, что у меня каждый элемент в БД имеет вид

    ('Мазаново',), ('Молчаново',)

    ?

  • Gorgio Govani, Во-первых, "у меня не работает" - это не ответ. Какое сообщение об ошибке? Если нет сообщения, то как ведёт себя программа?
    Во-вторых, что значит

    Возможно потому, что у меня каждый элемент в БД имеет вид
    ('Мазаново',), ('Молчаново',)

    У тебя так представлены данные в БД? Или ты просто сделал print() и увидел незнакомые буквы?
    Не путай представление в БД с тем, как эти данные представляются в Питоне после выборки, и с тем, как эти же данные выводятся в консоль.

  • Vindicar, что так токсично?
    Тот код никак не влияет на результаты, что он есть, что его нет.
    Сделал print.
    Учту на будущее и не буду путать.
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Юрий Linux Ответ

Для реализации множественного выбора в SQLite через LIKE и REGEXP в Python, необходимо использовать операторы OR и регулярные выражения.

Ниже приведен пример кода на Python, демонстрирующий верную реализацию множественного выбора в SQLite через LIKE и REGEXP:

```python
import sqlite3
import re

# Устанавливаем соединение с базой данных SQLite
conn = sqlite3.connect('database.db')
cursor = conn.cursor()

# Создаем таблицу с данными
cursor.execute('''CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY,
name TEXT)''')

# Вставляем данные в таблицу
cursor.execute("INSERT INTO users (name) VALUES ('Alice')")
cursor.execute("INSERT INTO users (name) VALUES ('Bob')")
cursor.execute("INSERT INTO users (name) VALUES ('Charlie')")
cursor.execute("INSERT INTO users (name) VALUES ('David')")

# Выбираем данные, соответствующие условию множественного выбора
search_terms = ['A%', 'C%'] # Поиск всех имен, начинающихся на 'A' или 'C'

query = "SELECT * FROM users WHERE "
for term in search_terms:
query += "name LIKE ? OR "
query = query[:-4] # Удаляем последний OR
cursor.execute(query, search_terms)

# Выводим результаты
rows = cursor.fetchall()
for row in rows:
print(row)

# Закрываем соединение с базой данных
conn.close()
```

В данном примере мы создаем таблицу `users` с полями `id` и `name`, вставляем в нее данные и затем выбираем все строки, где поле `name` начинается с символов 'A' или 'C' с использованием оператора `LIKE` и множественного условия с помощью цикла.

Таким образом, приведенный код демонстрирует верную реализацию множественного выбора в SQLite через LIKE и REGEXP в Python.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно