通过CAST选择:成功;使用CAST更新:失败

时间:2019-03-27 12:30:23

标签: mysql

我不理解以下作品

SELECT price, CAST(price AS DECIMAL(10,2)) FROM orders;

但是更新都失败:

UPDATE orders SET price = CAST(price AS DECIMAL(10,2));
UPDATE orders SET price = CAST(CAST(price AS DECIMAL(10,2)) AS CHAR(20));

,显示错误:

Error Code: 1366. Incorrect DECIMAL value '0' for column '' at row -1

priceTEXT

据我所知,SELECT应该和UPDATE完全一样

3 个答案:

答案 0 :(得分:1)

在选择中,您仅在更新中将转换结果显示为小数,将小数保存为非数字
尝试将resul转换为字符串

    UPDATE orders SET price = CAST(CAST(ifnull(price,0) AS DECIMAL(10,2) AS char(20));

或者可能是您的值不能转换为十进制,例如,为此您可以留出一些空格,您可以使用大小写检查不同的条件

    UPDATE orders SET price = CAST(CAST(
         CASE when price IS NULL THEN 0 
              when trim(price) ='' THEN 0 
                ELSE price 
              END )  AS DECIMAL(10,2) AS char(20));

答案 1 :(得分:0)

如您陈述:

  

priceTEXT

因此,在第一个示例中,您正在将文本值转换为十进制值。

您的第二个查询(更新)有问题,因为您试图将文本属性更新为自身的十进制版本。更新文本值时,无需将其转换为小数。

您的声明,

  

据我所知,SELECT应该和UPDATE完全一样

有缺陷:使用SELECT,您将从数据中提取数据以供其他过程使用。这可能涉及将属性强制转换为另一种数据类型。

使用UPDATE语句,新值应与属性的数据类型相同。由于price是文本,因此新值应该是文本(这就是为什么您不应该将属性更新为本身的DECIMAL版本的原因。)

答案 2 :(得分:0)

您某处的值可能为空

CREATE TABLE `orders` (
  `price` VARCHAR(100) NOT NULL);

INSERT INTO orders (price) VALUES (''); -- Empty value

没有错误:

SELECT price, CAST(price AS DECIMAL(10,2)) FROM orders;

错误:

UPDATE orders SET price = CAST(price AS DECIMAL(10,2));

没有错误:

UPDATE orders SET price = CAST(price AS DECIMAL(10,2)) WHERE price <> ''