2010-07-10 8 views
8

नोट: यह SQLite के साथ है, हालांकि मुझे उम्मीद है कि समस्या क्यूटी पक्ष पर है।क्यूटी - एक QLqlQuery को "कहां ... IN" खंड के साथ QList को कैसे बांधें?

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 

फिर मैं यह सी ++ कोड चलाता हूं:

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"; 
} 

जो इस प्रिंट:


से पहले के बाद

कोई पंक्ति नहीं मुद्रित किया गया। मुझे लगता है कि ऐसा इसलिए है क्योंकि मैं किसी "इन" खंड में प्लेसहोल्डर को सीधे सूची नहीं जोड़ सकता। लेकिन क्या ऐसा करने का कोई तरीका है? मैं इसके बारे में कुछ भी नहीं ढूंढ पाया है।

उत्तर

6

मेरा प्रश्न कभी भी ध्यान न दें। मुझे लगता है कि फ्रेमवर्क या आरडीबीएमएस के बावजूद, मैं जो भी करने की कोशिश कर रहा हूं, तैयार बयान के साथ संभव नहीं है। आप "जहां एक्स (?)" कर सकते हैं, लेकिन फिर '?' एक एकल मान को संदर्भित करता है - यह मानों की सूची नहीं हो सकता है; या आप कर सकते हैं "जहां एक्स (?,?,?), और प्रत्येक '?' अलग से बाध्य होने की जरूरत है।

2

मैं थोड़ी देर के लिए ऐसा करने का एक तरीका ढूंढ रहा हूं, और Google बहुत उपयोगी नहीं था। मैंने इसके साथ खेलना शुरू कर दिया और यह पता चला कि यह वास्तव में संभव है, कम से कम एक सीमित डिग्री। मैंने इसे केवल पोस्टग्रेएसक्यूएल के साथ परीक्षण किया है, इसलिए मुझे अन्य आरडीबीएमएस के बारे में पता नहीं है। मेरा मामला केवल पूर्णांक कुंजी से संबंधित है, लेकिन सैद्धांतिक रूप से अन्य प्रकार के लिए भी काम करना चाहिए।
ऐसा करने का तरीका एक सरणी मैन्युअल और यह एक चर के लिए बाध्य। मैं ऐसे SELECT id, firstname, lastname FROM users WHERE id = ANY(:id) के रूप में एक मेज से उनके 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 के साथ काम करता है। हालांकि, उनके सरणी समर्थन के आधार पर इसे अन्य डेटाबेस में भी अनुकूलित करना संभव हो सकता है।

संबंधित मुद्दे