如何将空值转换为空白并将数字转换为小数点后 3 位?

How to cast nulls to blank and those with number to decimal 3 places?

如果我希望在没有 gpa 的情况下输出为空白,而在有 gpa 的情况下四舍五入到小数点后 3 位 - 我如何在一个语句中得到它?

这是我想出的 2 个陈述,但我无法将其合并为一个(如果答案为 null,则为空白,如果有 gpa,则为小数点后 3 位)。

小数3位:

NULLIF(cast(round(termgpa.gpa, 3) AS DECIMAL(18, 3)), 0)

如果为空则空白:

isnull(cast(termgpa.gpa as varchar), ' ')

使用 case 语句怎么样。此外,如果您希望该列同时包含空格和小数,则必须将其转换为 varchar。下面的语句同时显示了 null 和非 null。

declare @gpa decimal(18,5)

set @gpa = '5.789456'
select 
    case
        when @gpa is null then ''
        else cast(cast(round(@gpa, 3) AS DECIMAL(18, 3)) as varchar)
    end as gpa
--returns 5.789

set @gpa = null
select 
    case
        when @gpa is null then ''
        else cast(cast(round(@gpa, 3) AS DECIMAL(18, 3)) as varchar)
    end as gpa
--returns blank
CREATE TABLE [dbo].[termgpa](
    [id] [int] NULL,
    [gpa] [decimal](18, 3) NULL
) ON [PRIMARY]
GO
INSERT [dbo].[termgpa] ([id], [gpa]) VALUES (1, CAST(20.000 AS Decimal(18, 3)))
GO
INSERT [dbo].[termgpa] ([id], [gpa]) VALUES (2, NULL)
GO
INSERT [dbo].[termgpa] ([id], [gpa]) VALUES (3, CAST(15.761 AS Decimal(18, 3)))
GO
INSERT [dbo].[termgpa] ([id], [gpa]) VALUES (4, CAST(45.650 AS Decimal(18, 3)))
GO
INSERT [dbo].[termgpa] ([id], [gpa]) VALUES (5, NULL)
GO
INSERT [dbo].[termgpa] ([id], [gpa]) VALUES (6, CAST(78.100 AS Decimal(18, 3)))
GO

我创建了只有两列的示例 table。现在您可以选择将小数列转换为 varchar,也可以设置 0 而不是空值,如下所示

SELECT ISNULL(CAST(gpa AS VARCHAR(20)),'') FROM dbo.termgpa

或者您可以在 gpa 为 null 时设置 0 或 -1 并在代码中进行处理

SELECT CASE WHEN gpa IS NULL THEN '0' ELSE CAST(gpa AS DECIMAL(18,3)) END FROM dbo.termgpa