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

问题描述 投票:0回答:3

我不明白以下的作品

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完全相同

mysql
3个回答
1
投票

在选择中,您只需在更新中显示强制转换的结果,您可以在非数字中保存小数 尝试将结果转换为字符串

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

0
投票

如你所述:

priceTEXT

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

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

你的陈述,

根据我的理解,SELECT应该与UPDATE完全相同

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

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


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 <> ''
© www.soinside.com 2019 - 2024. All rights reserved.