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

时间:2013-11-05 20:37:10

标签: sql sql-server sql-order-by

尝试使用此查询:

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)

2 个答案:

答案 0 :(得分:8)

This SQLfiddle demo会产生您描述的错误。

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

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

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

SQLfiddle demo

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

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

SQLfiddle demo

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

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

SQLfiddle demo

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

答案 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