3

私はすでにこのクエリを持っています:

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 番目の文字が <= 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))
4

2 に答える 2

2

はい、これは可能です。Mysql クエリには if ステートメントを含めることができますが、他の Piotr Wadas によって指摘されているように、それらは case ステートメントと呼ばれます。

ここを参照してください: http://dev.mysql.com/doc/refman/5.0/en/case.html

文字列から文字を抽出するには、部分文字列を使用します。 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
于 2012-09-15T23:55:31.627 に答える
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、またはその他の sth。

于 2012-09-15T23:58:24.430 に答える