尝试使用此查询:
SELECT clientId,
CountryCode
FROM client
ORDER BY
CASE
WHEN CountryCode IS NULL
THEN clientId
ELSE CountryCode
END
但收到错误消息:
Msg 8115,Level 16,State 5,Line 1
算术溢出错误将数字转换为数据类型varchar。
表结构是:
ClientId numeric(10,0)
CountryCode char(3)
答案 0 :(得分:8)
This SQLfiddle demo会产生您描述的错误。
您需要为每种数据类型使用不同的表达式,或者您需要使较低优先级数据类型(字符串)与较高的数据类型(字符串)兼容 - 通常通过将int转换为字符串。
您的要求不明确,但更简单的方法是简单地按一个而另一个订购。例如:
SELECT clientId, CountryCode
FROM dbo.client
ORDER BY CountryCode, clientId;
您也可以引入条件,但似乎并不需要它们。
SELECT clientId,
CountryCode
FROM dbo.client
ORDER BY CountryCode, CASE
WHEN CountryCode IS NULL
THEN clientId END;
......或者这个,以稍微不同的方式订购......
SELECT clientId,
CountryCode
FROM dbo.client
ORDER BY CASE
WHEN CountryCode IS NULL
THEN clientId END, CountryCode;
同样,您的要求不清楚 - 这些都可能无法产生您想要的结果。如果您准确显示您期望的输出,我们可以编写您需要的代码。
答案 1 :(得分:-2)
错误SQL Server根据您的查询定义:消息8114,级别16,状态5,行1 将数据类型nvarchar转换为数字时出错。 它清楚地说无法将varchar列(CountryCode)转换为数字
SELECT clientId, CountryCode FROM client
ORDER BY
CASE
WHEN CountryCode IS NULL THEN clientId
ELSE CountryCode
END
使用此修改您的查询。工作正常。
SELECT clientId, CountryCode FROM client
ORDER BY
CASE
WHEN clientId IS NULL THEN CountryCode
ELSE CountryCode
END
或者您可以使用
SELECT clientId, CountryCode
FROM client
ORDER BY
CASE
WHEN CountryCode IS NULL
THEN Right(100000000000 + clientId, 10)
ELSE CountryCode
END