首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用CAST选择:成功;使用CAST更新:失败

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

Stack Overflow用户
提问于 2019-03-27 12:30:23
回答 3查看 417关注 0票数 0

我不明白以下的作品

代码语言:javascript
复制
SELECT price, CAST(price AS DECIMAL(10,2)) FROM orders;

但这两种更新都失败了:

代码语言:javascript
复制
UPDATE orders SET price = CAST(price AS DECIMAL(10,2));
UPDATE orders SET price = CAST(CAST(price AS DECIMAL(10,2)) AS CHAR(20));

有错误:

代码语言:javascript
复制
Error Code: 1366. Incorrect DECIMAL value '0' for column '' at row -1

priceTEXT

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-03-27 12:37:45

在“选择”中,只需将强制转换为“十进制”的领事显示为“更新”中的“十进制”,就可以将十进制保存为非数字。

尝试将领事转换为字符串

代码语言:javascript
复制
    UPDATE orders SET price = CAST(CAST(ifnull(price,0) AS DECIMAL(10,2) AS char(20));

或者您可能有一个不能转换为十进制的值(例如,为此您可以使用大小写检查不同的条件)。

代码语言:javascript
复制
    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
EN

Stack Overflow用户

发布于 2019-03-27 12:39:54

如你所述:

priceTEXT

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

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

你的陈述,

据我理解,SELECT应该与更新完全相同。

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

使用UPDATE语句,新值应该与属性相同的数据类型。因为price是文本,所以新的值应该是文本(这就是为什么不应该将属性更新为本身的十进制版本)。

票数 0
EN

Stack Overflow用户

发布于 2019-03-27 12:48:03

你可能在某个地方有一个空值

代码语言:javascript
复制
CREATE TABLE `orders` (
  `price` VARCHAR(100) NOT NULL);

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

无错误:

代码语言:javascript
复制
SELECT price, CAST(price AS DECIMAL(10,2)) FROM orders;

错误:

代码语言:javascript
复制
UPDATE orders SET price = CAST(price AS DECIMAL(10,2));

无错误:

代码语言:javascript
复制
UPDATE orders SET price = CAST(price AS DECIMAL(10,2)) WHERE price <> ''
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55377255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档