2010-07-10 63 views
8

注意:這是與SQLite,但我期望問題是在Qt端。Qt - 如何使用「WHERE ... IN」子句將QList綁定到QSqlQuery?

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的命令行工具建立一個數據庫表(這些預期結果)

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<QVariant> statesList = QList<QVariant>(); 
     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」子句中的佔位符。但有沒有辦法做到這一點?我一直無法找到任何關於此的信息。

回答

6

別管我的問題。我認爲,無論框架或RDBMS如何,我所做的都無法用預先準備的語句來完成。你可以做「WHERE x IN(?)」,但是那個'?'指的是單個值 - 它不能是一個值列表;或者你可以做「WHERE x IN(?,?,?),每個'?'需要分開綁定

2

我一直在尋找一種方法來做到這一點,現在Google也不是很有幫助,我開始玩弄它,事實證明它確實有可能,至少在有限的程度上,我只用PostgreSQL進行了測試,所以我不知道其他的RDBMS。我的例子只涉及整數鍵,但理論上也適用於其他類型的鍵。
做到這一點的方法是建立一個陣列手動並將其綁定到一個變量。說我要選擇多個用戶通過他們的id期從一個表,如SELECT id, firstname, lastname FROM users WHERE id = ANY(:id)。下面是它如何可以做到的。

QList<int> 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。但是,也可以根據陣列支持情況將其適用於其他數據庫。