1

尝试使用此查询:

SELECT clientId,
   CountryCode
FROM client
ORDER BY 
CASE 
WHEN CountryCode IS NULL
THEN clientId
ELSE CountryCode
END

但收到错误消息:

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

表结构为:

ClientId    numeric(10,0)
CountryCode char(3)
4

2 回答 2

8

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

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

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

SELECT clientId, CountryCode
FROM dbo.client
ORDER BY CountryCode, clientId;

SQLfiddle 演示

您也可以引入条件,但它们似乎不是必需的。

SELECT clientId,
   CountryCode
FROM dbo.client
ORDER BY CountryCode, CASE 
WHEN CountryCode IS NULL
THEN clientId END;

SQLfiddle 演示

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

SELECT clientId,
   CountryCode
FROM dbo.client
ORDER BY CASE 
WHEN CountryCode IS NULL
THEN clientId END, CountryCode;

SQLfiddle 演示

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

于 2013-11-05T21:10:26.190 回答
-2

错误 SQL 服务器从您的查询中定义:消息 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
于 2013-11-05T20:51:01.393 回答