[英]How to get rid of string concatenation for SQL query
我刚刚编写了以下代码:
QSqlQuery query(_db);
QString sql =
"SELECT company_name, server_name, product_name, product_version, license_end, last_update, comment"
" FROM foo WHERE";
if (!include_unlimited)
{
sql += " license_end > NOW() AND license_end != '9999-01-01'";
}
else if (!include_trial)
{
sql += " license_end = '9999-01-01'";
}
else
{
sql += " license_end > NOW()";
}
if (product_name != "*")
{
sql += " AND product_name = :product_name";
}
sql += " ORDER BY license_end";
query.prepare(
sql
);
if (sql.contains(":product_name"))
{
query.bindValue(":product_name", product_name);
}
query.exec();
while (query.next())
{
LicenseInfo license;
license.company_name = query.value(0).toString();
license.server_name = query.value(1).toString();
license.product_name = query.value(2).toString();
license.product_version = query.value(3).toInt();
license.license_end = query.value(4).toString();
license.last_update = query.value(5).toString();
license.comment = query.value(6).toString();
licenses.append(license);
}
如何摆脱SQL查询的此字符串串联?
如果您不想连接,则只需编写整个查询,包括所有先决条件,然后使用绑定变量启用,禁用where子句。 像这样:
SELECT company_name, server_name, product_name
, product_version, license_end, last_update, comment
FROM foo
WHERE ( (:include_unlimited IS NOT NULL AND license_end > NOW() AND license_end != '9999-01-01')
OR (:include_trial IS NOT NULL AND license_end = '9999-01-01')
OR (:include_trial IS NULL AND :include_unlimited IS NULL AND license_end > NOW())
)
AND (product_name = :product_name OR :product_name = '*')
ORDER BY product_name
我尚未在MySQL上进行过测试,但是在某些情况下必须使用一种选择语句来实现许多逻辑的情况下使用了这种方法。
然后,绑定部分可能看起来像:
query.bindValue(":include_trial", include_trial ? QVariant(include_trial) : QVariant());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.