SQL中列的可变精度

SQL中列的可变精度,sql,oracle,ddl,sqldatatypes,Sql,Oracle,Ddl,Sqldatatypes,我有一列由三种不同类型的数字组成: 类型1在小数点后没有数字,如5、17等 类型2在小数点后有一位数字,如27.5,11.8等 类型3在小数点后有两位数字,如227.64,35.77等 我希望类型1的数字在小数点后有一个0,这样它们就变成22.0,11.0等等,而类型2和类型3的数字不受影响 可以通过将值推入字符串来完成 DECLARE @table AS TABLE (myValue FLOAT) INSERT INTO @table (myValue) VALUES

我有一列由三种不同类型的数字组成:

  • 类型1在小数点后没有数字,如
    5
    17
  • 类型2在小数点后有一位数字,如
    27.5
    11.8
  • 类型3在小数点后有两位数字,如
    227.64
    35.77

我希望类型1的数字在小数点后有一个0,这样它们就变成
22.0
11.0
等等,而类型2类型3的数字不受影响

可以通过将值推入字符串来完成

DECLARE @table AS TABLE (myValue FLOAT)

INSERT  INTO @table
        (myValue)
VALUES  (5),
        (17),
        (27.5),
        (11.8),
        (227.64),
        (35.77)

SELECT  CASE WHEN CAST(myValue AS VARCHAR(20)) LIKE '%.%' THEN CAST(myValue AS VARCHAR(20))
             ELSE CAST(myValue AS VARCHAR(20)) + '.0'
        END
FROM    @table

这充其量是一个糟糕的解决方案。您最好以原始格式维护数据,然后按照Ankit所述在表示层中处理格式。我知道这并不总是可能的,但数据位置并不是这样做的地方。

列的数据类型是什么

尝试:


这样做的地方是在表示层中,您可以将值转换为所需格式的字符串。(因为22.0是22,后者是存储的内容)使用应用程序层来实现这一点。必须说明这是Microsoft SQL Server答案,而不是plsql/oracle。希望它能引导您朝着正确的方向前进。这似乎不是一个基于Oracle的解决方案,而这正是OP所追求的(参见标签)。
SELECT
CASE
WHEN LEN(RIGHT([MyColumn], CHARINDEX('.', REVERSE([MyColumn])))) >= 3
    THEN [MyColumn]
ELSE CAST(CAST([MyColumn] AS NUMERIC(8,1)) AS NVARCHAR(10))
END AS [MyColumn]

FROM [MyTable]