Sql 从合并的int计算返回varchar值

Sql 从合并的int计算返回varchar值,sql,sql-server-2008,sql-server-2014-express,Sql,Sql Server 2008,Sql Server 2014 Express,我是一个使用AdventureWorks2012数据库学习T-SQL的新手。我使用的是SQLServer2014,不过如果有一个同样适用于2008的解决方案,那就太好了。我得到了以下练习: 使用Sales.SpecialOffer表编写查询。显示MinQty和MaxQty列之间的差异以及SpecialOfferID和Description列 问题是,MaxQty允许空值,所以我试图为输出提供一个真实的解决方案,而不需要在其中保留空值。然而,当我尝试使用coalesce返回'No Max'yes时

我是一个使用AdventureWorks2012数据库学习T-SQL的新手。我使用的是SQLServer2014,不过如果有一个同样适用于2008的解决方案,那就太好了。我得到了以下练习:

使用Sales.SpecialOffer表编写查询。显示MinQty和MaxQty列之间的差异以及SpecialOfferID和Description列

问题是,MaxQty允许空值,所以我试图为输出提供一个真实的解决方案,而不需要在其中保留空值。然而,当我尝试使用coalesce返回'No Max'yes时,我得到的是,我可以在其中保留NULL,但我试图看看我是否能够解决这个问题,我得到的消息是,varchar值'No Max'不能转换为数据类型int。我假设这是因为作为int的MaxQty-MinQty优先

select 
    specialofferid
    , description
    , coalesce((maxqty - minqty),'No Max') 'Qty_Difference'
from 
    sales.specialoffer;
错误:

Msg 245,16级,状态1,第135行 将varchar值“No max”转换为数据类型int时,转换失败

我考虑过只返回一个无意义的整数0或一个负数,但这似乎并不完美——如果返回0,我会模糊结果实际上为零的情况,等等


想法?

我会用一个案例陈述,这样你就可以做你想做的事情

select specialofferid
, description
, CASE 
     WHEN  maxqty is null THEN 'No Max'
     ELSE (maxqty - minqty) 'Qty_Difference'
  END
from sales.specialoffer;

您只需要确保COALESCE函数调用的所有参数都具有一致的数据类型。因为您无法回避No Max是字符串这一事实,所以必须通过强制转换表达式来确保maxqty-minqty部分也被视为字符串

select specialofferid
, description
, coalesce(cast(maxqty - minqty as varchar),'No Max') 'Qty_Difference'
from sales.specialoffer;
编辑:有关错误原因的更多详细信息

如果没有显式强制转换,则COALESCE函数尝试将No Max字符串转换为int的原因如下所示:

结果表达式的数据类型确定不同。ISNULL使用第一个参数的数据类型,COALESCE遵循大小写表达式规则并返回具有最高优先级的值的数据类型

如果您检查不同类型的优先级,如文档所示,那么您将看到int的优先级高于varchar


因此,一旦在对COALESCE的调用中混合了数据类型,SQL Server将尝试将所有不匹配的参数转换为具有最高优先级的数据类型,在本例中为int。要覆盖该默认行为,需要显式类型转换。

varchar value'Null value'?maxqty或minqty将在何处转换为字符串?@MarcB:选择coalescecastnull作为int,'a';->将varchar值“a”转换为数据类型int时转换失败。@Andomar:是的,但OP的查询中没有“Null值”…抱歉,我复制了以前的错误消息,并对其进行了更新。请确保类型一致:coalescecastmaxqty-minqty为varchar,“no Max”我无法使其正常工作,我得到一个错误:isnull函数需要2个参数。当我将其修改为isnullmaxqty时,我得到:一个在预期条件的上下文中指定的非布尔类型的表达式,接近“THEN”,我应该说我以前尝试过case,并且在将varchar值“No Max”转换为数据类型int时得到相同的错误转换失败。。我的想法有点不同:“Qty_Different”=当maxqty为null时为“No Max”,当maxqty为null时为“No Max”,然后为maxqty-minqtyend@JulianDrago我已经有一段时间没有使用isnull了。进行了更改。当-1=isnullcolumn时,为什么确切地说是-1,而不是列为null时的专用语法?更不用说我上面说的了:一个列应该只有一种类型。您的查询将创建两个,如果它能工作的话。@underline\d谢谢,这实际上是我想要的,我在想其他很多数据库..这个。列只能有一种类型。啊,好的。因此,不是maxqty-minqty是一个优先于字符串的int,而是该列在某些情况下将具有int,在其他情况下具有varchar。非常有用,我甚至没想到。谢谢我猜想查询结果的第一个类型将被解释为生成列的“the”类型。@下划线和OP:错误发生的原因已清楚地记录在案。我编辑了我的答案以包含相关信息。