【问题标题】:How to order table with two different columns having different data types?如何对具有不同数据类型的两个不同列的表进行排序?
【发布时间】:2013-11-05 20:37:10
【问题描述】:

尝试使用此查询:

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)

【问题讨论】:

  • 您希望所有带有 CountryCode 的记录都排在第一位吗?数据是什么样的?
  • 请给出示例预期输出。现在看起来您正在尝试完成一些没有意义的事情,因为数字将排序在字母国家代码之上。
  • ORDER BY CountryCode, clientID 还不够吗?

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    SQL 服务器从您的查询中定义的错误是:Msg 8114, Level 16, State 5, Line 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
    

    【讨论】:

    • 两个箱子都是CountryCode订购的
    • 7 AFG 2 AUS 1 IND 3 NAM 6 PAK 5 RUS 4 SAM
    • @mbeckish : 请查看输出
    • @Kaf 在您的第二个建议中击败了您。
    猜你喜欢
    • 2016-04-17
    • 1970-01-01
    • 2020-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多