【问题标题】:get 0 when emptyornull values else max(id) when column datatype is numeric in sql server当 SQL Server 中的列数据类型为数字时,为空或空值时获取 0,否则为 max(id)
【发布时间】:2019-07-23 08:06:38
【问题描述】:

您好,我对 sql server 有一个疑问

当列数据类型 i 是 sql server 中的数字时,当为空或空值时获取 0 否则为 max(id) 表:empid

CREATE TABLE [dbo].[empid](
    [id] [numeric](11, 0) NULL
) ON [PRIMARY]
GO
INSERT [dbo].[empid] ([id]) VALUES (NULL)
GO
INSERT [dbo].[empid] ([id]) VALUES (CAST(6 AS Numeric(11, 0)))
GO

基于以上数据,我想要如下输出

id

6

我尝试如下

select case when isnull( max(id),'')='' then cast (0  as numeric) else max(id end test from )
    [Test].[dbo].[empid]

但是上面的查询出错了 消息 8114,第 16 层,状态 5,第 9 行 将数据类型 varchar 转换为数值时出错。

假设表中没有记录,那么 maxid 将得到 0

请告诉我如何编写查询以在 sql server 中完成此任务

【问题讨论】:

  • 您在此处实际使用的是哪个版本的 SQL Server? 2008 年现已完全失去支持。

标签: sql-server-2008 sql-server-2012


【解决方案1】:

您应该使用 COALESCE 函数,该函数使您能够将潜在的 NULL 替换为您希望的任何内容(在当前情况下为 0),如下所示:

select coalesce(id, 0) as id from [dbo].[empid];

【讨论】:

  • 假设记录有空的空间那么它就不会工作
  • @gbalu,在当前格式中,列 [id] 不能接受空格,因为它被定义为数字。
【解决方案2】:

为什么使用''?只需使用0:

SELECT ISNULL(id,0) AS test
FROM dbo.empid;

ISNULL 返回第一个参数的数据类型,因此使用您拥有的 SQL,您隐式尝试将 '' 转换为 numeric,但失败了。

【讨论】:

  • 假设记录有空的空间那么它就不会工作
  • @gbalu id 定义为 [numeric](11, 0)不能有一个空白空间。 ' ' 不是数值。
【解决方案3】:

更好的方法是使用 SQL 提供的 COALESCE 函数

COALESCE(arg1, arg2[, argN])

它的作用是接受 N 个参数

  • arg1 是可以为空的列
  • arg2 是可以为空的列
  • argN 是您要替换的值

查询可能是

 SELECT COALESCE(Id, 0) as Id FROM [dbo].[empid]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    • 2014-02-01
    • 2022-12-06
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    相关资源
    最近更新 更多