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

虽然 I group by uptwo, 0.5 没有出现在该列中。0.5 值发生了什么变化?


编辑:正如对Todd Gibson 的回答的评论中所指出的,我也尝试使用
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在 之后进行评估GROUP BY,因此IF()将返回值转换为整数(来自布尔表达式),因此您0.5将被四舍五入,1但如果您明确地将 a0放在小数位前,IF()则将返回值视为十进制,包括布尔表达式的结果(即1.00.0)。

或者您甚至可以将单引号括起来,.4以便将列值视为字符串,因此某些值看起来是整数和一些小数。在数值上下文中使用时,这些值应自动转换(即SELECT ('2.5' * 3.5) AS test #8.75)。

于 2012-06-13T02:00:15.333 回答
1

我认为 uptwo 和 upthree 列被隐式转换为整数。在 expression2 上使用 convert() 将其强制为小数。

于 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
因此,第一个表达式的值用于替换第二个表达式0.5

让我们分析第一个if函数语句:
语法IF(expr1,expr2,expr3)
含义if value of expr1 is >= 1 use expr1 else use expr3
Expression1pz*uz//这个值必须是'>= 1'.
Expression2 : left(pz,2)<=>left(lpad(uz,5,0),2)// 这个值是'1'or '0'
表达式3.5

于 2012-06-04T17:42:58.960 回答