从合并 int 计算返回 varchar 值

Jul*_*ago 4 sql sql-server-2008 sql-server-2014-express

我是一名新手,正在学习使用数据库的 T-SQL 方法AdventureWorks2012。我使用的是 SQL Server 2014,不过如果有一个也适用于 2008 的解决方案就太好了。我得到了以下练习:

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

问题是,MaxQty允许空值,所以我试图为输出提出一个不涉及将空值留在其中的现实世界解决方案。但是,当我尝试使用合并返回“No Max”时(是的,我知道我可以将 NULL 保留在那里,但我试图看看是否可以解决这个问题),我收到的消息是值varchar“ No Max' 无法转换为数据类型int。我假设这是因为MaxQty - MinQtyasint优先?

select 
    specialofferid
    , description
    , coalesce((maxqty - minqty),'No Max') 'Qty_Difference'
from 
    sales.specialoffer;
Run Code Online (Sandbox Code Playgroud)

错误:

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

我想过只返回一个无意义的整数(0或负数),但这似乎并不完美 - 如果返回 0 我会掩盖结果实际上为零的情况,等等。

想法?

sst*_*tan 5

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

select specialofferid
, description
, coalesce(cast(maxqty - minqty as varchar),'No Max') 'Qty_Difference'
from sales.specialoffer;
Run Code Online (Sandbox Code Playgroud)

编辑:有关错误原因的更多详细信息

COALESCE如果没有显式转换,函数尝试将No Max字符串转换为 an的原因int可以通过以下记录的规则来解释:

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

如果您检查不同类型的优先级(如此处所述)那么您将看到 的int优先级高于varchar

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