将 MySQL 中的文本转换为数字以允许算术运算符
Convert Text to Number in MySQL to allow arithmetic operators
我正在处理一些蹩脚的数据源(数据存储在另一个数据库中并作为文本推送到我的数据库中,即使它应该存储为整数......情况并非总是如此,但它由于数据源的设置方式而经常发生,不幸的是我不能只更改数据源)。
我想对这些数据执行一些简单的函数,但由于许多值以文本形式存储,算术运算符的结果值为零。
有没有一种方法可以在我的 SQL 查询中将字符串转换为数字,以允许这些函数 return 列总和的值而不是零:
SELECT
closeout_sl_dataform
.OFS_ID
作为 OFS
,
((closeout_sl_dataform
.PO1_FE_HRS_CLOSEOUT_SL
+ closeout_sl_dataform
.PO2_FE_HRS_CLOSEOUT_SL
) + closeout_sl_dataform
.PO3_FE_HRS_CLOSEOUT_SL
) AS TOTAL_FE_HOURS
,
((closeout_sl_dataform
.PO1_FE_COST_CLOSEOUT_SL_USD
+ closeout_sl_dataform
.PO2_FE_COST_CLOSEOUT_SL_USD
) + closeout_sl_dataform
.PO3_FE_COST_CLOSEOUT_SL_USD
) AS TOTAL_FE_COST
,
((closeout_sl_dataform
.PO1_CRAFT_COST_CLOSEOUT_SL_USD
+ closeout_sl_dataform
.PO2_CRAFT_COST_CLOSEOUT_SL_USD
) + closeout_sl_dataform
.PO3_CRAFT_COST_CLOSEOUT_SL_USD
) AS TOTAL_CRAFT_COST
,
closeout_sl_dataform
.CRANE
作为 TOTAL_CRANE
,
closeout_sl_dataform
.SCAFFOLDING
作为 TOTAL_SCAFF
,
closeout_sl_dataform
.PO1_TOTAL_COST_CLOSEOUT_SL
作为 TOTAL_PO1
,
closeout_sl_dataform
.PO2_TOTAL_COST_CLOSEOUT_SL
作为 TOTAL_PO2
,
closeout_sl_dataform
.PO3_TOTAL_COST_CLOSEOUT_SL
作为 TOTAL_PO3
,
((closeout_sl_dataform
.PO1_TOTAL_COST_CLOSEOUT_SL
+ closeout_sl_dataform
.PO2_TOTAL_COST_CLOSEOUT_SL
) + closeout_sl_dataform
.PO3_TOTAL_COST_CLOSEOUT_SL
) AS SUMPO123
来自 closeout_sl_dataform
就像现在一样,TOTAL_FE_HOURS
大多数时候的结果为 0,因为表达式中的值是文本类型而不是整数。我的表都具有 VARCHAR 列值,以便接受这些值,无论它们在原始数据源中设置为整数还是数字。
感谢您的帮助!我是 SQL 的新手,虽然我确定这可能是微不足道的,但我正在跌跌撞撞地尝试自己弄清楚。
我相信您需要添加到每个字符串到数字字段的代码片段是 CONVERT(SUBSTRING_INDEX(field,'-',-1),UNSIGNED INTEGER)
。例如:
CAST(REPLACE(REPLACE(IFNULL(closeout_sl_dataform.PO1_FE_HRS_CLOSEOUT_SL,0),',',''),'$','') AS DECIMAL(10,2)) +
CAST(REPLACE(REPLACE(IFNULL(closeout_sl_dataform.PO2_FE_HRS_CLOSEOUT_SL,0),',',''),'$','') AS DECIMAL(10,2)) +
CAST(REPLACE(REPLACE(IFNULL(closeout_sl_dataform.PO3_FE_HRS_CLOSEOUT_SL,0),',',''),'$','') AS DECIMAL(10,2)) AS TOTAL_FE_HOURS
我正在处理一些蹩脚的数据源(数据存储在另一个数据库中并作为文本推送到我的数据库中,即使它应该存储为整数......情况并非总是如此,但它由于数据源的设置方式而经常发生,不幸的是我不能只更改数据源)。
我想对这些数据执行一些简单的函数,但由于许多值以文本形式存储,算术运算符的结果值为零。
有没有一种方法可以在我的 SQL 查询中将字符串转换为数字,以允许这些函数 return 列总和的值而不是零:
SELECT
closeout_sl_dataform
.OFS_ID
作为 OFS
,
((closeout_sl_dataform
.PO1_FE_HRS_CLOSEOUT_SL
+ closeout_sl_dataform
.PO2_FE_HRS_CLOSEOUT_SL
) + closeout_sl_dataform
.PO3_FE_HRS_CLOSEOUT_SL
) AS TOTAL_FE_HOURS
,
((closeout_sl_dataform
.PO1_FE_COST_CLOSEOUT_SL_USD
+ closeout_sl_dataform
.PO2_FE_COST_CLOSEOUT_SL_USD
) + closeout_sl_dataform
.PO3_FE_COST_CLOSEOUT_SL_USD
) AS TOTAL_FE_COST
,
((closeout_sl_dataform
.PO1_CRAFT_COST_CLOSEOUT_SL_USD
+ closeout_sl_dataform
.PO2_CRAFT_COST_CLOSEOUT_SL_USD
) + closeout_sl_dataform
.PO3_CRAFT_COST_CLOSEOUT_SL_USD
) AS TOTAL_CRAFT_COST
,
closeout_sl_dataform
.CRANE
作为 TOTAL_CRANE
,
closeout_sl_dataform
.SCAFFOLDING
作为 TOTAL_SCAFF
,
closeout_sl_dataform
.PO1_TOTAL_COST_CLOSEOUT_SL
作为 TOTAL_PO1
,
closeout_sl_dataform
.PO2_TOTAL_COST_CLOSEOUT_SL
作为 TOTAL_PO2
,
closeout_sl_dataform
.PO3_TOTAL_COST_CLOSEOUT_SL
作为 TOTAL_PO3
,
((closeout_sl_dataform
.PO1_TOTAL_COST_CLOSEOUT_SL
+ closeout_sl_dataform
.PO2_TOTAL_COST_CLOSEOUT_SL
) + closeout_sl_dataform
.PO3_TOTAL_COST_CLOSEOUT_SL
) AS SUMPO123
来自 closeout_sl_dataform
就像现在一样,TOTAL_FE_HOURS
大多数时候的结果为 0,因为表达式中的值是文本类型而不是整数。我的表都具有 VARCHAR 列值,以便接受这些值,无论它们在原始数据源中设置为整数还是数字。
感谢您的帮助!我是 SQL 的新手,虽然我确定这可能是微不足道的,但我正在跌跌撞撞地尝试自己弄清楚。
我相信您需要添加到每个字符串到数字字段的代码片段是 CONVERT(SUBSTRING_INDEX(field,'-',-1),UNSIGNED INTEGER)
。例如:
CAST(REPLACE(REPLACE(IFNULL(closeout_sl_dataform.PO1_FE_HRS_CLOSEOUT_SL,0),',',''),'$','') AS DECIMAL(10,2)) +
CAST(REPLACE(REPLACE(IFNULL(closeout_sl_dataform.PO2_FE_HRS_CLOSEOUT_SL,0),',',''),'$','') AS DECIMAL(10,2)) +
CAST(REPLACE(REPLACE(IFNULL(closeout_sl_dataform.PO3_FE_HRS_CLOSEOUT_SL,0),',',''),'$','') AS DECIMAL(10,2)) AS TOTAL_FE_HOURS