我已经有了这个问题:
cursor.execute("SELECT calldate, dst, billsec, accountcode, disposition,
(billsec/60*%s) as total
FROM cdr
WHERE calldate >= '%s' and calldate < '%s'
and disposition like '%s' and accountcode = '%s'
and dst like '%s'" %(rate, start_date, end_date, status, accountcode, destino)
)
Obs:dst是一个电话号码。
但现在我需要做的是:如果dst的第5个字符是&lt; = 5,那么billsec / 60 * 0.11总数 否则billsec / 60 * 0.16。
有可能吗?
这样我在mysql语法中出错:
cursor.execute("""SELECT calldate, dst, billsec, accountcode, disposition,
case when cast(substring(dst,4,1), unsigned) <= 5 then
billsec/60*%s as total
else
billsec/60*%s as total
end case
FROM cdr where calldate >= '%s' and calldate < '%s' and disposition like '%s' and accountcode = '%s' and dst like '%s'""" %(rate_fixo, rate_movel, start_date, end_date, status, accountcode, destino))
答案 0 :(得分:2)
是的,这是可能的。 Mysql查询可以包含if语句,只有它们被称为case语句,正如其他Piotr Wadas所指出的那样。
见这里:http://dev.mysql.com/doc/refman/5.0/en/case.html
要从字符串中提取字符,请使用substring。 http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_substr
所以完整的解决方案就像:
case when cast(substring(dst,4,1), unsigned) <= 5 then
billsec/60*0.11
else
billsec/60*0.16
end case
答案 1 :(得分:2)
使用SELECT实际指定要返回的列集。这个集合可以是列的名称,也可以是这些列的特定转换,调用SQL函数。 “IF”实际上与过程SQL更相关,在您的示例中,您需要一些称为CASE表达式的东西。 诀窍是在CASE表达式中定义结果集中的列,如此
SELECT acol, bcol, ccol, dcol from t1 where ...
与
比较SELECT acol, CASE WHEN sqlfunc_like_substr(someparams,bcol) THEN bcol ELSE some_other_way_modified(bcol) END, ccol, dcol from t1 WHERE ...
目前不记得CASE的确切语法,但这就是方法。更多,你可以命名结果列,例如
SELECT acol as uuu, CASE WHEN ... END as mmm, ccol as nnn, dcol as qqq FROM t1 where...
等等:)重点是理解,SELECT实际上并没有选择要检索的列,而是定义了特定的结果列集,其中一些列在表中,一些列为列值的子结果转换或字符串,或NULL,或其他。