كيو تي-كيفية ربط قائمة إلى كسكلكيري مع عبارة" أين IN في"?

StackOverflow https://stackoverflow.com/questions/3220357

  •  13-09-2020
  •  | 
  •  

سؤال

ملاحظة:هذا هو مع سكليتي ، على الرغم من أنني أتوقع المشكلة على الجانب كيو تي.

أولا ، أقوم بإعداد جدول قاعدة بيانات من أداة سطر الأوامر سكليتي:

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

(هذه هي النتائج المتوقعة.)

ثم أقوم بتشغيل هذا الرمز:

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

الذي يطبع هذا:

قبل
بعد

لم تتم طباعة أي صفوف.أفترض أن هذا لأنني لا أستطيع ربط قائمة مباشرة بعنصر نائب في جملة" في".ولكن هل هناك طريقة للقيام بذلك?لم أتمكن من العثور على أي شيء عن هذا.

هل كانت مفيدة؟

المحلول

لا يهمني سؤالي.أعتقد أن ما أحاول فعله غير ممكن مع البيانات المعدة، بغض النظر عن الإطار أو RDBMS.يمكنك أن تفعل "أين x في (؟)"، ولكن بعد ذلك "؟"يشير إلى قيمة واحدة - لا يمكن أن تكون قائمة بالقيم؛أو يمكنك القيام به "أين س في (؟،؟،؟)، وكل منها"؟ "يحتاج إلى أن تكون ملزمة بشكل منفصل.

مثال:

giveacodicetagpre.

نصائح أخرى

لقد كنت تبحث عن وسيلة للقيام بذلك أيضا لفترة من الوقت الآن ، وجوجل لم تكن مفيدة جدا.لقد بدأت اللعب معها واتضح أنه من الممكن بالفعل, بدرجة محدودة على الأقل.يتم اختباره فقط مع كيو و سكليتي ، لذلك أنا لا أعرف عن ردبس الأخرى.تتعلق حالتي فقط بمفاتيح عدد صحيح ، ولكن يجب أن تعمل نظريا لأنواع أخرى أيضا.
طريقة القيام بذلك هي بناء مصفوفة يدويا وربطها بمتغير.قل أنني أريد تحديد عدة مستخدمين حسب 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", numberlist);
sql.exec();

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

كتبته من الذاكرة ، ولكن يجب أن يكون على ما يرام.أعلم أن هذا الرد متأخر للغاية ، ولكن آمل أن يساعد هذا المنشور شخصا آخر هناك.المقتطف أعلاه يعمل فقط مع كيو.ومع ذلك ، من الممكن تكييف هذا مع قواعد البيانات الأخرى أيضا ، اعتمادا على دعم المصفوفة.

ل سكليتي استبدال الاستعلام سكل مع:

sql.prepare("SELECT id, firstname, lastname FROM users WHERE id IN (:id)");

يجب عليك استخدام QSQLQuery :: execbatch

giveacodicetagpre.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top