给定一个有2个字段number_value
和decimal_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));
该表有数千行,它们具有不同的值。我不明白为什么这是不可能的,可以想到许多不同的情况下,我希望它是。谢谢。
1条答案
按热度按时间flvlnr441#
如果查看SQL解析器代码,就不难理解为什么这是不可能的。
precision
的语法规则不接受表达式。它只接受无符号整数文字。https://github.com/mysql/mysql-server/blob/8.0/sql/sql_yacc.yy#L7361-L7367
这是ANSI/ISO SQL标准为语法定义的内容。精度和小数位数只能是无符号整数。
你不能在那里使用一个表达式。如果需要缩放是可变的,则必须使用动态SQL。
你还说:
该表有数千行,它们具有不同的值。
即使使用动态SQL,也不能使数值列在每行上具有不同的小数位数。在SQL中,给定列在结果集的每一行上必须具有相同的数据类型。