如何使用具有不同数据类型的两个不同列来排序表?

use*_*929 1 sql sql-server sql-order-by

试图使用此查询:

SELECT clientId,
   CountryCode
FROM client
ORDER BY 
CASE 
WHEN CountryCode IS NULL
THEN clientId
ELSE CountryCode
END
Run Code Online (Sandbox Code Playgroud)

但收到错误信息:

消息8115,级别16,状态5,行1
算术溢出错误将数字转换为数据类型varchar.

表结构是:

ClientId    numeric(10,0)
CountryCode char(3)
Run Code Online (Sandbox Code Playgroud)

Aar*_*and 8

此SQLfiddle演示会产生您描述的错误.

您需要为每种数据类型使用不同的表达式,或者您需要使较低优先级数据类型(字符串)与较高的数据类型(int)兼容 - 通常通过将int转换为字符串.

您的要求不明确,但更简单的方法是简单地按一个然后另一个订购.例如:

SELECT clientId, CountryCode
FROM dbo.client
ORDER BY CountryCode, clientId;
Run Code Online (Sandbox Code Playgroud)

SQLfiddle演示

您也可以引入条件,但似乎并不需要它们.

SELECT clientId,
   CountryCode
FROM dbo.client
ORDER BY CountryCode, CASE 
WHEN CountryCode IS NULL
THEN clientId END;
Run Code Online (Sandbox Code Playgroud)

SQLfiddle演示

......或者这个,以略微不同的方式订购......

SELECT clientId,
   CountryCode
FROM dbo.client
ORDER BY CASE 
WHEN CountryCode IS NULL
THEN clientId END, CountryCode;
Run Code Online (Sandbox Code Playgroud)

SQLfiddle演示

同样,您的要求不清楚 - 这些都可能无法产生您想要的结果.如果您准确显示您期望的输出,我们可以编写您需要的代码.