MySQL中如何区分字符串字段的数值/非数值执行算术运算?
解决字符串字段数值判断与算术运算问题
我的表中有一个string类型的dealer_price字段,数据如下:
| dealer_price | | ------------------ | | 1000.00 | | 5000.00 | | Contact for pricing| | 10000.00 |
执行查询 select (dealer_price + 10) AS cust_price FROM my_table 时,非数值字符串会被当作0参与运算,我需要实现:如果字段值是数值则执行算术运算,否则直接显示原内容,期望输出:
| cust_price | | ------------------ | | 1010.00 | | 5010.00 | | Contact for pricing| | 10010.00 |
分数据库实现方案
MySQL/MariaDB
通过正则匹配判断数值格式,结合IF函数分支处理:
SELECT IF(dealer_price REGEXP '^[0-9]+(\.[0-9]+)?$', CAST(dealer_price AS DECIMAL(10,2)) + 10, dealer_price ) AS cust_price FROM my_table;
正则表达式^[0-9]+(\.[0-9]+)?$用于匹配整数或小数格式的数值,符合条件则转成DECIMAL类型执行加法,否则返回原字符串。
PostgreSQL
利用TRY_CAST尝试转换数值,失败返回NULL,再通过COALESCE兜底返回原内容:
SELECT COALESCE( CAST(TRY_CAST(dealer_price AS NUMERIC) + 10 AS TEXT), dealer_price ) AS cust_price FROM my_table;
TRY_CAST转换成功则执行加法后转回文本,失败时COALESCE会取第二个参数即原字符串。
SQL Server
使用TRY_CONVERT尝试转换,逻辑与PostgreSQL一致:
SELECT COALESCE( CAST(TRY_CONVERT(DECIMAL(10,2), dealer_price) + 10 AS VARCHAR(50)), dealer_price ) AS cust_price FROM my_table;
TRY_CONVERT转换数值成功则运算后转成字符串,失败返回原字段内容。
内容的提问来源于stack exchange,提问作者Badal Solanki
相关产品推荐
相关产品推荐

