-2

次のコードの何が問題になっているのか知りたいのですが。

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))

この方法で試しましたが、機能しませんでした。

cursor.execute("""SELECT calldate, dst, billsec, accountcode, disposition,
    case when cast(substring(dst,4,1), unsigned) <= 5 then 
        billsec/60*%s 
    else 
        billsec/60*%s 
    end as total
    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))

エラー:

「SQL構文にエラーがあります。MySQLサーバーのバージョンに対応するマニュアルで、'unsignedの近くで使用する正しい構文を確認してください)<= 5 then billsec / 60 * 0.1 else billsec / 60 * 0.2 end as total FROM cdr 1行目でw'")

4

1 に答える 1

2

MySQLには2つのcaseステートメント構文があります。1つはクエリ用、もう1つはストアドプロシージャ用です。クエリでsprocバージョンを使用しているため、エラーが発生します。クエリバージョンには「エンドケース」はありません。

SELECT ..., CASE WHEN ... THEN... END 
                                      ^---no 'case' here
FROM ...

- - ファローアップ

また、ケースのコンポーネントにエイリアスを付けることはできません。これにより、ケースの評価結果に応じて、フィールドの名前が動的に変更されます。エイリアスできるのは、caseステートメント全体のみです。

SELECT ..., CASE WHEN ... THEN ... END AS total
                                      ^^^^^^^^^

例えば

mysql> select case when 1=1 then 'a' else 'b' end case, 'hello';
                                                  ^^^^---syntax error         
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'case, 'hello'' at line 1

mysql> select case when 1=1 then 'a' else 'b' end, 'hello';     
+-------------------------------------+-------+
| case when 1=1 then 'a' else 'b' end | hello |
+-------------------------------------+-------+
| a                                   | hello |
+-------------------------------------+-------+
1 row in set (0.00 sec)

mysql> select case when 1=1 then 'a' as 'a_val' else 'b' as 'b_val' end, 'hello
';
                                    ^^^^^^^^^^^--error  ^^^^^^^^^^^--- error
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'as 'a_val' else 'b' as 'b_val' end, 'hello'' at line 1

mysql> select case when 1=1 then 'a' else 'b' end as total, 'hello';           
+-------+-------+
| total | hello |
+-------+-------+
| a     | hello |
+-------+-------+
1 row in set (0.00 sec)
于 2012-09-16T03:28:51.540 に答える