当前位置:  开发笔记 > 编程语言 > 正文

Qt - 如何使用"WHERE ... IN"子句将QList绑定到QSqlQuery?

如何解决《Qt-如何使用"WHEREIN"子句将QList绑定到QSqlQuery?》经验,为你挑选了2个好方法。

注意:这是使用SQLite,虽然我预计问题出在Qt端.

首先,我从SQLite命令行工具设置数据库表:

sqlite> create table testtable ( id INTEGER PRIMARY KEY NOT NULL, state INTEGER );
sqlite> insert into testtable (state) values (0);
sqlite> insert into testtable (state) values (1);
sqlite> insert into testtable (state) values (9);
sqlite> insert into testtable (state) values (20);

然后我测试我的查询:

sqlite> SELECT id,state FROM testtable WHERE state IN (0,1,2);
1|0
3|1

(这些是预期的结果.)

然后我运行这个C++代码:

void runQuery() {
        QSqlQuery qq;
        qq.prepare( "SELECT id,state FROM testtable WHERE state IN (:states)");
        QList statesList = QList();
        statesList.append(0);
        statesList.append(1);
        statesList.append(2);
        qq.bindValue(":states", statesList);
        qq.exec();
        qDebug() << "before";
        while( qq.next() ) {
            qDebug() << qq.value(0).toInt() << qq.value(1).toInt();
        }
        qDebug() << "after";
}

打印这个:

之前
之后

没有打印行.我假设这是因为我无法将列表直接绑定到"in"子句中的占位符.但有办法吗?我一直无法找到任何相关信息.



1> Travis..:

别介意我的问题.我认为无论框架或RDBMS如何,我准备做的事情都不可能使用预准备语句.你可以做"WHERE x IN(?)",但接着是"?" 是指单个值 - 它不能是值列表; 或者你可以做"WHERE x IN(?,?,?),每个'?' 需要单独绑定.



2> 小智..:

一段时间以来,我一直在寻找一种实现此目的的方法,而Google并不是很有帮助。我开始试用它,事实证明,确实确实有可能,至少在有限的程度上。我仅在PostgreSQL上进行过测试,因此我不了解其他RDBMS。我的情况仅涉及整数键,但理论上也应适用于其他类型。
完成此操作的方法是手动构建数组并将其绑定到变量。假设我id要从表中选择多个用户,例如SELECT id, firstname, lastname FROM users WHERE id = ANY(:id)。这是可以完成的。

QList ids; // A list of IDs to select
ids << 1 << 5 << 7;

// Create strings from list
QStringList idstrings;
foreach(int id, ids) {
    idstrings << QString::number(id);
}
QString numberlist = idstrings.join(",");

// Create, prepare and execute the query
QSqlQuery sql;
sql.prepare("SELECT id, firstname, lastname FROM users WHERE id = ANY(:id)");
sql.bindValue(":id", QString("{%1}").arg(numberlist));
sql.exec();

// Now this is possible
while( sql.next() ) {
    qDebug() << sql.value(0).toInt() << sql.value(1).toString() << sql.value(2).toString();
}

从内存中键入,但应该可以。我知道这个回复太晚了,但是希望这篇文章能对其他人有所帮助。如前所述,这仅适用于PostgreSQL。但是,根据阵列的支持,也可能使它适应其他数据库。

推荐阅读
乐韵答题
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有