将varchar和十进制字段相乘

时间:2014-05-28 13:15:27

标签: sql sql-server sql-server-2008-r2

我有一个包含字段的表:

doses_given decimal(9,2)

我想在这个领域成倍增加:

drug_units_per_dose varchar(255)

所以我做了这样的事情:

CAST(ppr.drug_units_per_dose as decimal(9,2)) * doses_given dosesGiven,

然而,看看数据,我注意到一些奇怪的字符:

select distinct(drug_units_per_dose) from patient_prescr

NULL

1
1-2
1-4
1.5
1/2
1/4
10
12
15
1½
2
2-3
2.5
20
2½
3
3-4
30
4
5
6
7
8
½

正如您所看到的,我得到的一些字符不能是CAST到十进制。在网页上,这些字段被解释为一个小1/2符号:

enter image description here

是否有用.5替换½字段以准确完成乘法?

2 个答案:

答案 0 :(得分:2)

1/2符号是ascii字符189,所以要替换:

CAST(REPLACE(ppr.drug_units_per_dose,char(189),'.5') as decimal(9,2)) * doses_given dosesGiven

答案 1 :(得分:1)

你有一个相当讨厌的问题。你有一个正常人认为是整数或浮点数的字段drug_units_per_dose。显然,您的数据库的设计者是超常规的人,他们理解这个概念的更广泛的选择。

我说部分舌头在脸颊,但要说明重点。数据库中的列不代表数字,至少在所有情况下都不代表。我建议你有drug_units_per_dose的翻译表。它将包含如下列:

1       1
1/2     0.5
3-4     ??

我意识到你会有数百行,而且很多行看起来都是多余的,因为它们将是" 50,50"和" 100,100"。但是,如果您希望控制业务逻辑以将这些字符串转换为数字,那么查找表似乎是最安全的方法。