在mysql中,当使用强制转换为decimal时,是否有任何方法可以使用字段值作为参数?

dy1byipe  于 2023-05-28  发布在  Mysql
关注(0)|答案(1)|浏览(146)

给定一个有2个字段number_valuedecimal_value的表,我希望在转换时能够传递decimal_value作为参数。
假设number_value中的字符串是“219578684607.829”,decimal_value是“2”。
这个方法的作用是:

SELECT CAST("219578684607.829" AS DECIMAL(25,2));

这不会:

SELECT CAST("219578684607.829" AS DECIMAL(25,CAST("2" AS UNSIGNED)));

最后,我试图使工作的查询看起来像这样:

Select cast(number_value as DECIMAL(25, decimal_value));

该表有数千行,它们具有不同的值。我不明白为什么这是不可能的,可以想到许多不同的情况下,我希望它是。谢谢。

flvlnr44

flvlnr441#

如果查看SQL解析器代码,就不难理解为什么这是不可能的。precision的语法规则不接受表达式。它只接受无符号整数文字。
https://github.com/mysql/mysql-server/blob/8.0/sql/sql_yacc.yy#L7361-L7367

precision:
          '(' NUM ',' NUM ')'
          {
            $$.length= $2.str;
            $$.dec= $4.str;
          }
        ;

这是ANSI/ISO SQL标准为语法定义的内容。精度和小数位数只能是无符号整数。
你不能在那里使用一个表达式。如果需要缩放是可变的,则必须使用动态SQL。
你还说:
该表有数千行,它们具有不同的值。
即使使用动态SQL,也不能使数值列在每行上具有不同的小数位数。在SQL中,给定列在结果集的每一行上必须具有相同的数据类型。

相关问题