【问题标题】:SQL thinks 100 is less than 56SQL 认为 100 小于 56
【发布时间】:2014-04-23 14:56:33
【问题描述】:

我在 Sequel Pro 中对列表进行排序,但排序不正确。这是查询:

Select personID, yearID, x, y
from Table
Where x>=25
order by y asc

这就是我得到的:

playerID    yearID  x    y

****    1930    40  170
****    1921    59  171
****    1930    41  174
****    1938    50  175
****    1927    47  175
****    1937    40  183
****    1931    46  184
****    1930    56  191
****    2002    27  56
****    1973    26  56
****    2008    25  56

表格在两个方向上延伸 - 它从 y=100 的顶部开始,以 y=99 的底部结束。显然它认为 3 位数字低于 2 位数字。但为什么?我该如何解决这个问题?

另外,y 是 VARCHAR 类型,长度为 255。

【问题讨论】:

  • 因为varchar类型不被视为数字,数据类型可以改为数字吗?
  • Select personID, yearID, x, y from Table where x>=25 order by DECIMAL(y) asc
  • 这样做是为了让您非常恼火,以至于您最终放弃并使用数字的正确数据类型来修复您的设计。
  • @a_horse_with_no_name 感谢您的讽刺和完全的无益。回复您的 cmets - 我是关系数据库的新手,我只是寻求帮助。另外,我提到我正在使用 Sequel Pro(这是原始问题的一部分,我在看到您的评论后没有添加它)。下次你可能想真正阅读这个问题。
  • @user3081195:仅供参考,据我所知,Sequel Pro 只是 MySQL 数据库的管理应用程序。您使用的数据库是 MySQL。

标签: sql


【解决方案1】:

您正在经历的被称为字典排序。这意味着,因为您的字段是 varchar 而不是像 int 这样的数字类型,服务器不知道您实际上是在处理数字。它不是按数值(您想要的)排序,而是执行正常的字母排序。 15 之前,所以它首先被排序。

解决问题的真正方法是为您的字段使用正确的数据类型。如果您的数据是数字,请使用适当的数字类型(例如,int 用于整数值,floatdouble 用于浮点值,decimal 用于十进制值等)。如果这样做,排序将按预期进行。

另一种方法是在order by 子句中执行转换以强制按数字排序。

Select personID, yearID, x, y
from Table
Where x>=25
order by convert(int, y) asc

但是你应该真的修复这些字段;这个解决方案只是一个创可贴。

【讨论】:

  • 我试过这个但得到这个:尝试通过 ALTER TABLE Table CHANGE y y INT(255) NULL DEFAULT NULL MySQL 更改字段 'y' 时发生错误:不正确的整数值:第 7 行的列 'y' 的 ''
  • 第 7 行不包含任何值。它不为空。
  • @user3081195:那么这个值是什么意思呢?你会如何处理一个非数字的值?
  • 文件不是我创建的,是从某个地方导入的。
  • @user3081195:这仍然不能说明当值为空字符串或其他非数字值时会发生什么。
【解决方案2】:

您只需在排序前将 Y 的值转换为数字。像这样的:

Select personID, yearID, x, y
from Table
Where x>=25
order by cast(y as int) asc

如果不是 Y 中的所有内容都可以转换为整数,则预计会出现问题。

【讨论】:

    【解决方案3】:

    由于y 字段是文本,因此值56 应该位于值191 之后是正确的。这就是文本的排序方式。

    如果要对文本所代表的数值进行排序,则必须在对它们进行排序时将每个值转换为数字:

    Select personID, yearID, x, y
    from Table
    Where x>=25
    order by cast(y as signed integer) asc
    

    【讨论】:

      【解决方案4】:

      CAST VARCHAR as Numeric,它会起作用:-

      Select personID, yearID, x, y
      from Table
      Where x>=25
      order by CAST(y AS Numeric(10,0)) asc
      

      【讨论】:

        【解决方案5】:

        选择字段,CONVERT(y,UNSIGNED INTEGER) AS ynum 从表 按 ynum 排序;

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-11-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-05
          • 2013-12-29
          • 2020-08-09
          • 2015-07-13
          相关资源
          最近更新 更多