SQL Server:当小数不是十进制时该怎么办?

时间:2013-10-30 01:44:55

标签: sql sql-server decimal varchar

我的情况是十进制数字不是真正的小数,它是排序的子计数。例如,当填写药物处方时,给出Rx编号(比方说345673)。这个号码将在任何续号中保留处方,并且补充附加.1,.2等等。因此,在该Rx号码的有效期内,您可能最终得到345673,345673.1,345673.2 ......正在进行中。问题是当你点击.10,.20,.30等时。在十进制形式中,这些记录与.1,.2,.3相同。

有没有办法跟踪这些数字并支持尾随零而不使用VARCHAR等?这是主键列,我对在Pk上使用varchar并不感到疯狂(这是老式的吗?)

感谢任何建议/帮助。

编辑添加:我应该解释为什么我们不能为此使用单独的列。此数据来自其他地方,并通过批量导入操作合并到我们的数据库中。合并是永久性的,因为大部分数据在原点被更改,并在下一次批量导入时合并。 Rx编号必须完全匹配才能执行批量导入/合并。

2 个答案:

答案 0 :(得分:1)

我建议使用composite primary key。添加第二列,可能称为refill,并将其用于增量值。这样,两列都是整数,不需要为主键使用varchar。

您可能需要使用trigger来维护该值,因为identity字段不适用于分组。

答案 1 :(得分:1)

使用varcharCONVERT将小数转换为CAST。然后,您可以使用LEFT()SUBSTRING()REPLACE()等字符/字符串函数。

另一种选择是使用数学解析小数:

DECLARE @RxValue decimal(18,4) = 100.234
SELECT @RxValue [Rx Number]
    ,@RxValue - CONVERT(int,@RxValue) [Refill Count Decimal]
    ,LEN(CONVERT(float,(@RxValue - CONVERT(int,@RxValue))))-2 [After Decimal Length]
    ,POWER(10, LEN(@RxValue - CONVERT(int,@RxValue))-2) [Calc multiplier for Refill Count]
    ,CONVERT(int,@RxValue) [Rx ID]
    ,CONVERT(int,(@RxValue - CONVERT(int,@RxValue)) * POWER(10, LEN(CONVERT(float,(@RxValue - CONVERT(int,@RxValue))))-2)) [Refill Count]

上面选择的最后两列是您想要的两列。以上所有就是我试图“展示我的作品”,这样你就可以看到我的想法。 “-2”是删除“0”。超出LEN()函数的结果。 POWER()函数取10并将其提高到小数结果的幂。

您只需要将所有对@RxValue的引用替换为“Rx编号”的列名称即可使其正常工作。如果您想要使用它,可以将@RxValue中的值更改为您想要的值,并确保结果符合您的预期。 请务必更改@RxValue的数据类型以匹配您的数据。

当然,如果情况如此,您可以将“Rx号码”保留为PK。您只需添加几个派生列:[Rx ID][Refill Count]

如果您有疑问,请发表评论。