首页 > 解决方案 > 具有多个 WHERE 过滤器的 QtSql 动态选择查询

问题描述


该方法应如下所示:

/**
 * @brief getData executes sql select query.
 * @param query [out] QSqlQuery query object after executing the query.
 * @param queryFilters [in] map of query filters (column-name, filter- 
   value).
 * @param table [in] table name.
 * @return 
 */
bool getData(QSqlQuery &query, std::map<std::string,QVariant> &queryFilters, 
std::string &table){
        bool status = false;
        std::string queryText = "SELECT * from " + table + " WHERE  ";
        // I should apply filters from queryFilters map here.
        return status;
} 

标签: c++sqlqtwhereqtsql

解决方案


有几种方法可以做到这一点。

使用 for 循环和std::map.

使用for循环遍历您的密钥对值。

bool getData(QSqlQuery &query, const std::map<std::string,QVariant> &queryFilters,
             std::string &table)
{
    // ...

    std::string queryText = "SELECT * from " + table + " WHERE";
    
    for (auto it = queryFilters.begin(); it != queryFilters.end(); )
    {
        queryText += " " + it->first + "='" + it->second.toString().toStdString() + "'";
    
        it++;
        // check the iterator isn't the last iterator
        if (it != queryFilters.end())
            queryText += " AND";    // separate your "filters" using an AND
    }

    // ...      
}

使用 for 循环和QMap.

但这就是 Qt,所以为什么不利用QMap,QStringListQStringQTL 类型。

bool getData(QSqlQuery &query, const QMap<QString, QVariant> &queryFilters,
             const QString &table)
{
    //  ...
    
    QString queryText = "SELECT * from " + table + " WHERE ";
    QStringList filters;
    foreach (const QString &filterKey, queryFilters.keys())
        filters << filterKey + "='" + queryFilters.value(filterKey).toString() + "'";
    
    queryText += filters.join(" AND ");
    
    //  ...
    
}

请注意,这foreach是一个 Qt 定义的宏。请参阅foreach 关键字

对于您可能想要了解的其他 QTL 类型,请参阅容器


QSqlQueryModel???

我无法从您的问题和评论中判断您是否真的在后台有一个 sql 表模型/视图/小部件,或者您是否完全使用了其他东西。

我考虑过使用循环来解决这个问题。但是,我认为使用一些 qt 类有更好的方法,例如:QSqlQueryModel

当然,只是浏览文档,QSqlQueryModel没有过滤功能。

但是……确实有这个功能。有利的一面是,如果您已经在某个地方坐着,您可以将其升级为 a,因为后者继承了前者。但同样,我没有足够的信息来做出判断,所以我只是在这里在黑暗中引导你。QSqlTableModel QSqlQueryModelQSqlTableModel

希望这个答案能对您的困境有所启发,同时提醒您如何提出更好的问题以获得更准确的回答。


推荐阅读