2016-02-07 123 views
1

擺脫字符串連接的我只是寫了下面的代碼:如何獲得SQL查詢

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查詢?

+0

到底是什麼問題 – sagi

+0

@sagi我認爲人工字符串連接長相醜陋,我不知道什麼是重新寫這個的最佳方式代碼 – FrozenHeart

+0

我能想到的唯一方法(因爲查詢取決於條件)而不是串聯它們,只需使用sql = WHOLE QUERY。也許它會更具可讀性 – sagi

回答

1

如果你不想連接,你只需編寫整個查詢,涉及所有的前提條件並使用綁定變量來啓用,禁用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,但使用在某些情況下,一個必須實現的一個SELECT語句很多邏輯的這種做法。

結合部分會那麼很可能再像:

query.bindValue(":include_trial", include_trial ? QVariant(include_trial) : QVariant());