Михаиллл
МихаилллҚар. 21, 2018, 3:07 Т.Ж.

Как использовать поиск "или" в QSqlTableModel для SQLite

QSqlTableModel, Qt, SQLite

Здравствуйте.

У меня есть поле со многими checkBox. При выборе нескольких  checkBox нужно реализовать поиск в SQLite c помощью QSqlTableModel::setSort()  так, чтобы выполнилось условие или тут нашло, или тут, или тут или везде.



Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

30
Ruslan Polupan
  • Қар. 21, 2018, 4:11 Т.Ж.
  • (өңделген)
  • Жауап шешім ретінде белгіленді.

Вот пример моего кода:

void FindWindow::on_lineEditFind_textChanged(const QString &arg1)
{
    if(arg1.length()>=3){
        filter =QString("ZN LIKE ('%%1%') OR FN LIKE ('%%1%')").arg(arg1);
    } else {
        filter="ZN LIKE ('') OR FN LIKE ('')";
    }
    modelRro->select();
    modelRro->setFilter(filter);
    ui->tableViewRezult->resizeColumnsToContents();
}

При изменении содержимого lineEdit происходит установка фильтра,

    Михаиллл
    • Қар. 21, 2018, 5 Т.Ж.

    Спасибо.

    В 4 строчке ZN и FN это названия столбцов?

      Ruslan Polupan
      • Қар. 21, 2018, 6:13 Т.Ж.

      Да это название столбцов

        Михаиллл
        • Қар. 21, 2018, 8:55 Т.Ж.
        • (өңделген)

        Что то у меня не работает.

        Если делать так, то запрос выполняется

        setFilter( "Gender LIKE ('мужчина') ")

        а если так, то почему-то не выполняется условие или

        setFilter("Name LIKE ('мужчина') OR Gender LIKE ('мужчина') OR PhoneNumber LIKE ('мужчина') ")


          Ruslan Polupan
          • Қар. 21, 2018, 9:46 Т.Ж.
          • (өңделген)

          Тестируйте запросы в менеджере БД, а потом что все после WHERE используйте как аргумент  setFilter.

          Не плохо бы было увидеть саму таблицу и задачу которая вам необходима для установки фильтра


            Михаиллл
            • Қар. 21, 2018, 11:47 Т.Ж.

            Я проверял названия столбцов.

            Вот код бд

            PRAGMA foreign_keys = 0;


            CREATE TABLE sqlitestudio_temp_table AS SELECT *

            FROM SQLliteResumeArray;


            DROP TABLE SQLliteResumeArray;


            CREATE TABLE SQLliteResumeArray (

            NumberID              INTEGER PRIMARY KEY AUTOINCREMENT

            NOT NULL

            UNIQUE,

            Name                  TEXT,

            Gender                TEXT,

            Age                   INTEGER,

            DateOfBirth           DATE,

            PhoneNumber           TEXT,

            Email                 TEXT,

            City                  TEXT,

            BusinessTrip          TEXT,

            PostDesired           TEXT,

            Salary                INTEGER,

            CVPost                TEXT,

            NameCompany           TEXT,

            Experiance            TEXT,

            Languages             TEXT,

            AdditionalInformation TEXT,

            Education             TEXT,

            Skills                TEXT,

            Comments              TEXT,

            Resume                TEXT

            );


            INSERT INTO SQLliteResumeArray (

            NumberID,

            Name,

            Gender,

            Age,

            DateOfBirth,

            PhoneNumber,

            Email,

            City,

            BusinessTrip,

            PostDesired,

            Salary,

            CVPost,

            NameCompany,

            Experiance,

            Languages,

            AdditionalInformation,

            Education,

            Skills,

            Comments,

            Resume

            )

            SELECT NumberID,

            Name,

            Gender,

            Age,

            DateOfBirth,

            PhoneNumber,

            Email,

            City,

            BusinessTrip,

            PostDesired,

            Salary,

            CVPost,

            NameCompany,

            Experiance,

            Languages,

            AdditionalInformation,

            Education,

            Skills,

            Comments,

            Resume

            FROM sqlitestudio_temp_table;


            DROP TABLE sqlitestudio_temp_table;


            CREATE INDEX IndexResumeArray ON SQLliteResumeArray (

            NumberID,

            Name,

            Age,

            DateOfBirth,

            PostDesired,

            CVPost,

            PhoneNumber,

            Email,

            City,

            Salary,

            NameCompany,

            Education,

            Languages,

            Experiance,

            Gender,

            AdditionalInformation,

            Comments,

            Resume,

            BusinessTrip,

            Skills

            );


            PRAGMA foreign_keys = 1;



              Ruslan Polupan
              • Қар. 22, 2018, 2:05 Т.Ж.

              Сделал базу по вашей таблице

              Запрос работает.

              select * from SQLliteResumeArray
              where Name LIKE ('мужчина') OR Gender LIKE ('мужчина') OR PhoneNumber LIKE ('мужчина') 

              Проверьте в своем менеджере БД, возможно у вас база пустая.

              во вложении SQL файл с вашей таблицей. Выполните импорт и пробуйте.



                Михаиллл
                • Қар. 22, 2018, 3:32 Т.Ж.

                Спасибо.

                Извините за беспокойство.

                Просто запрос написал с маленькой буквы, а в бд он с большой.


                  Ruslan Polupan
                  • Қар. 22, 2018, 3:51 Т.Ж.

                  Что бы избежать подобных трудностей я всегда тестирую запросы напрямую а потом уже использую их в Qt

                    Михаиллл
                    • Қар. 22, 2018, 9:41 Т.Ж.

                    Скажите пожалуйста, как добавить по столбу  с INTEGER поиск от int a; до int b; ?

                      Михаиллл
                      • Қар. 22, 2018, 11:24 Т.Ж.

                      разобрался, так

                      SearchTableModel->setFilter(" Age > 30 ");

                          SearchTableModel->setFilter(" Age < 35 ");
                        Ruslan Polupan
                        • Қар. 22, 2018, 12:09 Т.Қ.

                        Еще можно так

                        SearchTableModel->setFilter("Age BETWEEN 30 AND 35");

                        Или  так

                        SearchTableModel->setFilter("Age>=30 AND Age <=35");


                          Михаиллл
                          • Қар. 23, 2018, 6:51 Т.Ж.

                          Да, ваш вариант правильный, а мой не работал, т.к. оказалось QSqlTableModel запоминает только последний setFilter().

                          А можно ли сделать сначала один запрос setFilter, а потом искать уже в найденном еще одним setFilter ,и так дальше?

                            Ruslan Polupan
                            • Қар. 23, 2018, 7 Т.Ж.

                            Если не сложно по конкретнее задачу поставьте, на примере таблицы что у вас есть.

                              Evgenii Legotckoi
                              • Қар. 23, 2018, 7:24 Т.Ж.

                              Нужно писать вложенные запросы. Или очень сложные фильтры конкретно для QSqlTableModel. Если хотите сохранить предыдущий запрос, то выполняйте это вручную в какую-нибудь переменную.

                              Ну или создавать временные таблицы в базе данных сырыми запросами, но это ещё сложнее будет.


                                Михаиллл
                                • Қар. 23, 2018, 8:02 Т.Ж.

                                На примере этой таблицы:

                                Сначала Age от 30 до 40

                                Потом Languages Languages LIKE ('Russian%')

                                Потом Languages City LIKE ('Москва%')

                                И так дальше. Просто количество фильтров не ограниченно и критерии поиска могут быть разнообразны.

                                С помощью вложенных запросов врятли получится так написать.

                                Если в переменную записывать, выйдет слишком громоздко и не оптимально будет идти поиск.

                                А как это сделать с помощью сложных фильтров QSqlTableModel?




                                  Ruslan Polupan
                                  • Қар. 23, 2018, 8:57 Т.Ж.
                                  • (өңделген)

                                  Тогда использовать QSortFilterProxyModel

                                  https://doc.qt.io/qt-5/qtwidgets-itemviews-customsortfiltermodel-example.html

                                  Либо пересмотреть структуру БД, для оптимизации построения запросов.

                                    Михаиллл
                                    • Қар. 27, 2018, 7:13 Т.Ж.

                                    Похоже что придется создавать временную таблицу.

                                    Новую таблицу нужно создавать через QSqlQuery?

                                    Не знаете, как новой таблице дать данные из setFilter()?



                                      Михаиллл
                                      • Қар. 27, 2018, 7:32 Т.Ж.
                                      • (өңделген)

                                      Пытаюсь создать временную таблицу так, но выдает ошибку QSqlError("1", "Unable to execute statement", "no such column: Name")

                                         QSqlQuery query;
                                              query.exec("CREATE TEMP TABLE TempTable1 AS SELECT "
                                                 " NumberID           ," 
                                                 "Name                ,"
                                                 "Gender              ,"
                                                 "Age                 ,"
                                                 "DateOfBirth         ,"
                                                 "PhoneNumber         ,"
                                                 "Email               ,"
                                                 "City                ,"
                                                 "BusinessTrip        ,"
                                                 "PostDesired         ,"
                                                 "Salary              ,"
                                                 "CVPost              ,"
                                                 "NameCompany         ,"
                                                 "Experiance          ,"
                                                 "Languages           ,"
                                                 "AdditionalInformation  ,"
                                                 "Education           ,"
                                                 "Skills              ,"
                                                 "Comments            ,"
                                                 "Resume               "
                                                 ";");
                                              qDebug() << "exec :" << query.lastError();
                                        Evgenii Legotckoi
                                        • Қар. 28, 2018, 3:13 Т.Ж.

                                        Если у вас фильтрация таблицы из разных фильтров, то лучше всё-таки попытаться написать фильтр правильно, например

                                        QString strFilter;
                                        
                                        if (count > 30)
                                        {
                                            strFilter.append("count_column > 30");
                                        }
                                        else if (/* ещё какое-нибудь условие*/)
                                        {
                                            strFilter.append(" AND ");
                                            strFilter.append("second_column LIKE 'value'");
                                        }

                                        ну и так далее, главное правильно сформировать фильтрующую запись. Это будет формирование более сложного запроса, но это будет всё-таки легче, чем использовать временную таблицу.

                                          Михаиллл
                                          • Қар. 28, 2018, 6:45 Т.Ж.

                                          Спасибо.

                                          А можно ли сделать поиск не чувствительным к регистру

                                            Evgenii Legotckoi
                                            • Қар. 29, 2018, 2:19 Т.Қ.

                                            У вас база данных SQLite?

                                            Как я понимаю, у неё нет встроенных механизмов, поэтому нужно извращаться, например так

                                            select * from mytable where  UPPER(field) like 'AAA';

                                              Ruslan Polupan
                                              • Қар. 30, 2018, 1:08 Т.Ж.

                                              SQLite из коробки не поддерживает кириллицу в UPPER :-(

                                                Evgenii Legotckoi
                                                • Қар. 30, 2018, 3:09 Т.Ж.

                                                То есть, решение из разряда фантастики стандартными средствами для SQLite?

                                                  Ruslan Polupan
                                                  • Қар. 30, 2018, 4:11 Т.Ж.
                                                  select
                                                    t.test_text
                                                  , upper(
                                                      (
                                                          WITH RECURSIVE
                                                          under_name(test_text, char, level) as 
                                                              (select t.test_text, '', 0
                                                              union
                                                              select test_text, coalesce(lu.u,substr(test_text,level,1)), under_name.level+1
                                                              from under_name
                                                              left join (
                                                                  select 'А' as u, 'а' as l union select 'Б' as u, 'б' as l union select 'В' as u, 'в' as l union select 'Г' as u, 'г' as l union select 'Д' as u, 'д' as l union select 'Е' as u, 'е' as l union select 'Ё' as u, 'ё' as l union select 'Ж' as u, 'ж' as l union select 'З' as u, 'з' as l union select 'И' as u, 'и' as l union select 'Й' as u, 'й' as l union select 'К' as u, 'к' as l union select 'Л' as u, 'л' as l union select 'М' as u, 'м' as l union select 'Н' as u, 'н' as l union select 'О' as u, 'о' as l union select 'П' as u, 'п' as l union select 'Р' as u, 'р' as l union select 'С' as u, 'с' as l union select 'Т' as u, 'т' as l union select 'У' as u, 'у' as l union select 'Ф' as u, 'ф' as l union select 'Х' as u, 'х' as l union select 'Ц' as u, 'ц' as l union select 'Ч' as u, 'ч' as l union select 'Ш' as u, 'ш' as l union select 'Щ' as u, 'щ' as l union select 'Ь' as u, 'ь' as l union select 'Ы' as u, 'ы' as l union select 'Ъ' as u, 'ъ' as l union select 'Э' as u, 'э' as l union select 'Ю' as u, 'ю' as l union select 'Я' as u, 'я' as l
                                                              ) lu on substr(test_text,level,1)=lu.l
                                                              where level <= length(test_text)
                                                          )
                                                          select group_concat(char,'') from under_name
                                                      )
                                                  ) upper_text
                                                  from
                                                  (select 'Съешь ещё этих  мягких французских булок, да выпей же чаю. Test.' test_text) t
                                                    Evgenii Legotckoi
                                                    • Қар. 30, 2018, 4:32 Т.Ж.

                                                    мне срочно нужно добавлять на сайт смайлики... фейспалма очень не хватает...

                                                      Михаиллл
                                                      • Қар. 30, 2018, 5:16 Т.Ж.
                                                      • (өңделген)

                                                      А как такой запрос отразится на скорости поиска?

                                                      И скажите пожалуйста, как это решение можно добавить в запрос

                                                      TableModel->setFilter(Name LIKE 'Вася');

                                                        Evgenii Legotckoi
                                                        • Жел. 3, 2018, 4:12 Т.Ж.

                                                        я думаю, если заменить  SQLite на другую БД, например  postgresql, то можно будет стандартными средствами этот поиск сделать, без таких извращений. И работать будет быстрее точно. Но пока это у вас не является узким местом, то и не замрочивайтесь. Преждевременная оптимизация тоже не нужна.

                                                          Михаиллл
                                                          • Жел. 4, 2018, 5:31 Т.Ж.

                                                          А вы не знаете, как в  postgresql сделать автозаполнение столбца с ключом?

                                                            Evgenii Legotckoi
                                                            • Жел. 4, 2018, 5:34 Т.Ж.
                                                            • (өңделген)

                                                            AUTOINCREMENT

                                                            bool DataBase::createTable()
                                                            {
                                                                QSqlQuery query;
                                                                if(!query.exec( "CREATE TABLE " TABLE " ("
                                                                                        "id INTEGER PRIMARY KEY AUTOINCREMENT, "
                                                                                        TABLE_DATE      " DATE            NOT NULL,"
                                                                                        TABLE_TIME      " TIME            NOT NULL,"
                                                                                        TABLE_RANDOM    " INTEGER         NOT NULL,"
                                                                                        TABLE_MESSAGE   " VARCHAR(255)    NOT NULL"
                                                                                    " )"
                                                                                )){
                                                                    qDebug() << "DataBase: error of create " << TABLE;
                                                                    qDebug() << query.lastError().text();
                                                                    return false;
                                                                } else {
                                                                    return true;
                                                                }
                                                                return false;
                                                            }

                                                            P/S/ этот ваш последний вопрос уже не имеет прямого отношения к фильтрам в таблице, создавайте, пожалуйста, новые темы для новых вопросов.

                                                              Пікірлер

                                                              Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
                                                              Кіріңіз немесе Тіркеліңіз
                                                              AD

                                                              C++ - Тест 004. Указатели, Массивы и Циклы

                                                              • Нәтиже:50ұпай,
                                                              • Бағалау ұпайлары-4
                                                              m
                                                              • molni99
                                                              • Қаз. 25, 2024, 10:37 Т.Қ.

                                                              C++ - Тест 004. Указатели, Массивы и Циклы

                                                              • Нәтиже:80ұпай,
                                                              • Бағалау ұпайлары4
                                                              m
                                                              • molni99
                                                              • Қаз. 25, 2024, 10:29 Т.Қ.

                                                              C++ - Тест 004. Указатели, Массивы и Циклы

                                                              • Нәтиже:20ұпай,
                                                              • Бағалау ұпайлары-10
                                                              Соңғы пікірлер
                                                              ИМ
                                                              Игорь МаксимовҚар. 22, 2024, 8:51 Т.Ж.
                                                              Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                                                              Evgenii Legotckoi
                                                              Evgenii LegotckoiҚаз. 31, 2024, 11:37 Т.Ж.
                                                              Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                                                              A
                                                              ALO1ZEҚаз. 19, 2024, 5:19 Т.Ж.
                                                              Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                                                              ИМ
                                                              Игорь МаксимовҚаз. 5, 2024, 4:51 Т.Ж.
                                                              Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                                                              d
                                                              dblas5Шілде 5, 2024, 8:02 Т.Ж.
                                                              QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                                                              Енді форумда талқылаңыз
                                                              m
                                                              moogoҚар. 22, 2024, 4:17 Т.Ж.
                                                              Mosquito Spray System Effective Mosquito Systems for Backyard | Eco-Friendly Misting Control Device & Repellent Spray - Moogo ; Upgrade your backyard with our mosquito-repellent device! Our misters conce…
                                                              Evgenii Legotckoi
                                                              Evgenii LegotckoiМаусым 24, 2024, 12:11 Т.Қ.
                                                              добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                                                              t
                                                              tonypeachey1Қар. 15, 2024, 3:04 Т.Ж.
                                                              google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                                                              NSProject
                                                              NSProjectМаусым 4, 2022, 12:49 Т.Ж.
                                                              Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…

                                                              Бізді әлеуметтік желілерде бақылаңыз