zoukankan      html  css  js  c++  java
  • mysql中字段类型转换排序

    表中字段server_id是varchar类型,现在我们查询数据时想以server_id排一下序,排序后的结果

    select server_id from cardserver where game_id = 1 order by server_id desc limit 10;
    

     +-----------+
    | server_id |
    +-----------+
    | 8         |
    | 7         |
    | 6         |
    | 5         |
    | 4         |
    | 3         |
    | 2         |
    | 10        |
    | 1         |
    +-----------+

    很明显,我们想要的结果应该是 10,8,7,6,5 这样的。但是这个10排在了2的后面。按照字符串来排的。其实我们是想把它当做数值来排。

    手动转换类型:

    用下面的方法就可以了,使server_id+0之后再排序,问题解决了。

    select server_id from cardserver where game_id = 1 order by server_id+0 desc limit 10;
    

    +-----------+

    | server_id |

    +-----------+

    | 10        |

    | 8         |

    | 7         |

    | 6         |

    | 5         |

    | 4         |

    | 3         |

    | 2         |

    | 1         |

    +-----------+

    使用MySQL函数CAST/CONVERT:

    mysql为我们提供了两个类型转换函数:CAST和CONVERT,现成的东西我们怎能放过?

    这个类型 可以是以下值其中的 一个:

    BINARY[(N)]

    CHAR[(N)]

    DATE

    DATETIME

    DECIMAL

    SIGNED [INTEGER]

    TIME

    UNSIGNED [INTEGER]

    所以我们也可以用CAST解决问题:

    CAST() 和CONVERT() 函数可用来获取一个类型的值,并产生另一个类型的值。

    select server_id from cardserver where game_id = 1 order by CAST(server_id as SIGNED) desc limit 10;
    

     +-----------+
    | server_id |
    +-----------+
    | 10        |
    | 8         |
    | 7         |
    | 6         |
    | 5         |
    | 4         |
    | 3         |
    | 2         |
    | 1         |
    +-----------+

    也可以使用CONVERT来搞定此问题:

    select server_id from cardserver where game_id = 1 order by CONVERT(server_id,SIGNED) desc limit 10;
    

     +-----------+
    | server_id |
    +-----------+
    | 10        |
    | 8         |
    | 7         |
    | 6         |
    | 5         |
    | 4         |
    | 3         |
    | 2         |
    | 1         |
    +-----------+

    总结:

    条条大道通罗马,条条小路通我家。不管是啥方法,解决问题就是好方法。当然,既然MySQL为我们提供了现成的函数。我们为何不让代码显得更漂亮些呢?呵呵。

    所以MySql varchar排序推荐使用CAST或CONVERT函数。

  • 相关阅读:
    PureBasic 打开一个一行有多个数据的文件并读取其中某个数据
    正则表达式的30分钟教程
    【编程珠玑】读书笔记 第一章 开篇
    while ((ch = getchar()) != EOF)中ch定义为char还是int型?cin、scanf等如何结束键盘输入
    itoa函数的实现(不同进制)
    atoi函数的实现(考虑不同进制、溢出)
    函数重载二义性:error C2668: 'pow' : ambiguous call to overloaded function
    strcat与strncat的C/C++实现
    strcpy函数的C/C++实现
    strlen的C/C+++实现
  • 原文地址:https://www.cnblogs.com/yuexin/p/3443913.html
Copyright © 2011-2022 走看看