2

私はmysqlバージョンを使用して5.1.41-3ubuntu12.10 (Ubuntu)います。

mysql> show create table tt\G
*************************** 1. row ***************************
       Table: tt
Create Table: CREATE TABLE `tt` (
  `pz` int(8) DEFAULT NULL,
  `os` varchar(8) DEFAULT NULL,
  `uz` int(11) NOT NULL,
  `p` bigint(21) NOT NULL DEFAULT '0',
  `c` decimal(23,0) DEFAULT NULL,
  KEY `pz` (`pz`),
  KEY `uz` (`uz`),
  KEY `os` (`os`),
  KEY `pz_2` (`pz`,`uz`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

mysql> select pz,uz,pz*uz,
    -> if(pz*uz,1,.5),
    -> left(pz,2) pl,left(lpad(uz,5,0),2) ul,
    -> p from tt limit 10;
+-------+----+-------+----------------+--------+----+--------+
|   pz  | uz | pz*uz | if(pz*uz,1,.5) |   pl   | ul |    p   |
+-------+----+-------+----------------+--------+----+--------+
|  NULL |  0 |  NULL |            0.5 | NULL   | 00 |   4080 |
|  NULL |  0 |  NULL |            0.5 | NULL   | 00 | 323754 |
| 89101 |  0 |     0 |            0.5 | 89     | 00 |   6880 |
|     0 |  0 |     0 |            0.5 | 0      | 00 |  11591 |
| 89110 |  0 |     0 |            0.5 | 89     | 00 |     72 |
| 78247 |  0 |     0 |            0.5 | 78     | 00 |     27 |
| 90062 |  0 |     0 |            0.5 | 90     | 00 |      5 |
| 63107 |  0 |     0 |            0.5 | 63     | 00 |      4 |
|  NULL |  0 |  NULL |            0.5 | NULL   | 00 |  54561 |
| 94102 |  0 |     0 |            0.5 | 94     | 00 |  12499 |
+-------+----+-------+----------------+--------+----+--------+

ここまでは順調ですね。ご覧のとおり、0.5はの値として表示されますif(pz*uz,1,.5)。問題は:

mysql> select os,
    -> if(pz*uz,left(pz,2)<=>left(lpad(uz,5,0),2),.5) uptwo,
    -> if(pz*uz,left(pz,3)<=>left(lpad(uz,5,0),3),.5) upthree,
    -> sum(p) p,sum(c) c
    -> from tt t
    -> group by os,uptwo,upthree order by null;

+----+-------+---------+---------+-------+
| os | uptwo | upthree |    p    |   c   |
+----+-------+---------+---------+-------+
| u  |     1 |       1 |   52852 |   318 |
| i  |     1 |       1 | 7046563 | 21716 |
| m  |     1 |       1 | 1252166 |  7337 |
| i  |     0 |       0 | 1830284 |  4033 |
| m  |     0 |       0 |  294612 |  1714 |
| i  |     1 |       0 |  911486 |  3560 |
| m  |     1 |       0 |  145182 |  1136 |
| u  |     0 |       0 |   12144 |    23 |
| u  |     1 |       0 |    1571 |     8 |
+----+-------+---------+---------+-------+

group by uptwoは、0.5はその列に表示されません。0.5の値はどうなりましたか?


編集:トッドギブソンの回答へのコメントに記載されているように、私も
if(pz*uz,cast(left(pz,2)<=>left(lpad(uz,5,0),2) as decimal),.5)代わりにそれを試しました
if(pz*uz,left(pz,2)<=>left(lpad(uz,5,0),2),.5)が、それも機能しませんでした。

4

3 に答える 3

3

.5の誤った条件としてではなくIF()、を使用します0.5

if(pz*uz,left(pz,2)<=>left(lpad(uz,5,0),2),0.5) uptwo

if(pz*uz,left(pz,3)<=>left(lpad(uz,5,0),3),0.5) upthree

何が起こっているのかというと、GROUP BYが評価された後、条件列の値は同じデータ型でなければならないということです。はの後にSELECT評価されるため、は(ブール式からの)整数を優先して戻り値を変換します。したがって、は切り上げられますが、小数点以下の桁の前に明示的にを置くと、は戻り値をブール式の結果を含む10進数(つまり、または)。GROUP BYIF()0.510IF()1.00.0

Or you could even put single quotes around the .4 so that the column values will be treated as strings, so some values would appear to be integers and some decimals. The values should be automatically converted when used in numerical contexts (i.e. SELECT ('2.5' * 3.5) AS test #8.75).

于 2012-06-13T02:00:15.333 に答える
1

uptwo列とupthree列は暗黙的に整数に変換されていると思います。expression2でconvert()を使用して、それを10進数に強制します。

于 2012-06-04T17:48:48.337 に答える
0

次のステートメントに問題があると思います。

-> if(pz*uz,left(pz,2)<=>left(lpad(uz,5,0),2),.5) uptwo,
-> if(pz*uz,left(pz,3)<=>left(lpad(uz,5,0),3),.5) upthree,

ステートメントでは、の値はpz*uz常にである必要がありますgreater than or equal to 1
したがって、最初の式の値は、2番目の式を置き換えるために使用されます0.5

if最初の関数ステートメントを分析してみましょう。
構文IF(expr1,expr2,expr3)
意味if value of expr1 is >= 1 use expr1 else use expr3
Expression1pz*uz//この値は。でなければなりません'>= 1'
Expression2left(pz,2)<=>left(lpad(uz,5,0),2)//この値はまたはのいずれ'1''0'です。
式3.5

于 2012-06-04T17:42:58.960 に答える