【问题标题】:Why do I need to CAST() in query?为什么我需要在查询中使用 CAST()?
【发布时间】:2014-01-10 06:07:49
【问题描述】:

可能,这是一个众所周知的问题,但我在文档中找不到答案。 如果我运行这些查询:

SELECT @next := 2, @amount := 1;

SELECT @next := 0.2, @amount := 0.1, @result := @next - @amount;

我会弄错@result = "0"

如果我再次运行第二个查询,结果将是正确的。

如果我在第二个查询中使用类型转换并再次运行这两个查询,结果也将是正确的。即,

SELECT @next := 0.2, @amount := 0.1, @result := CAST(@next AS DECIMAL(2,2)) - @amount;

为什么会这样?我应该读什么?

【问题讨论】:

    标签: mysql casting


    【解决方案1】:

    我认为你首先设置了@next := 2, @amount = 1。
    然后使 @next 和 @amount 类型为 int。
    因此,当您分配@next := 0.2 时,@amount := 0.1 在这一行上@next 的值为零,@amount 也是如此。 但在此选择运行后,@next 将类型更改为十进制。 看看到底发生了什么,试试这个

    SELECT @next := 2, @amount := 1;
    
    SELECT @next := 0.2, @amount := 0.1, @next, @amount, @result := @next - @amount;
    
    SELECT @next,@amount;
    

    所以不必 CAST,只需将您的第一条语句设置为

    SELECT @next := 2.0, @amount := 1.0;
    

    一切都将以小数开始,一切都应该按预期工作。

    【讨论】:

    • 啊,我明白了——用户变量保持它的起始类型,如果它不符合新赋值的类型,我需要明确地改变它!谢谢。
    【解决方案2】:

    强制转换表达式与 SQL CONVERT 具有相似的语义 表达。强制转换表达式用于转换一种类型的值 转换成另一种类型的值。

    DECIMAL 有两个部分:PrecisionScale。因此,您的部分查询将如下所示:

    CAST(@next AS DECIMAL(2,2))
    

    Precision 表示为值存储的有效位数。
    Scale表示小数点后可以存储的位数。

    Read More

    【讨论】:

    • 是的,我了解类型转换的作用。但为什么在我的示例中需要它?
    猜你喜欢
    • 2018-06-29
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    • 2019-04-07
    • 2018-01-12
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    相关资源
    最近更新 更多