是否可以对前导$或尾随%的varchar字段中的数值执行聚合函数?

时间:2019-03-26 13:05:18

标签: mysql

我有一个数据集,其中记录来自另一个我无法控制的系统。在一个字段中,存在诸如“ $ 200”和“ 20%”的值。我想使用一些聚合函数(AVG,中位数等)分析数字数据,如何在不真正从数据库中删除字符的情况下,出于计算目的而去除前导$或尾随%?

2 个答案:

答案 0 :(得分:0)

您可以在mysql中使用REPLACE()函数将您的值替换为空字符串。并且,如果需要任何强制转换,可以使用CAST()。

REPLACE('$', REPLACE('%', str, ''), '') // check both '$', '%' occurrences and replace
CAST(str AS UNSIGNED)

如果需要对'$'或'%'进行特定操作,则必须先使用LOCATE()检查值中的'$'或'%'标记,

LOCATE('$', str) > 0 // if '$' in the str
LOCATE('%', str) > 0 // if '%' in the str

答案 1 :(得分:0)

是的,这是可能的。通常有两种方法可以使这项工作:

  1. 在进行聚合之前,可以使用REPLACE()切掉非数字部分来对字符串进行篡改。如果您有一列具有固定的非数字部分(例如,当您汇总百分比或类似数值时。然后,一旦有了“干净”字符串,就可以根据需要将其强制转换为整数。考虑:

    SELECT CAST(REPLACE('%','25%','')AS UNSIGNED)AS编号

恢复数字后,您可以执行类似的操作

SELECT  
AVG(CAST(REPLACE('%', myPct, '') AS UNSIGNED)) + '%' AS averagePct
FROM myTable

如果您需要输出再次使符号带有特征。这样做不会修改任何表数据。

但是,一般而言,将符号放在数字列中被认为是不好的做法,应尽可能避免使用。您可以根据需要添加%和$分隔列之类的内容,但切勿混用这种数据类型,以免需要执行类似我上面概述的丑陋和易碎的工作。