国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

sql varchar排序CAST/CONVERT實現語句

2024-07-24 12:38:53
字體:
來源:轉載
供稿:網友

文章介紹了在自己利用普通排序對數據進行排序時發現varchar字符串排序無法得到我們想要的結果,下面我們來介紹利用 case或convert來解決這個問題.

是今天在后臺發現排序有問題,于是,沒辦法,改之,下面簡單說一下MySQL的varchar排序問題,引以為戒.

示例表結構,先來看一下,我的表結構:

  1. show create table cardserver G 
  2. *************************** 1. row *************************** 
  3.        Table: cardserver 
  4. Create TableCREATE TABLE `cardserver` ( 
  5.   `id` int(11) NOT NULL default '0'
  6.   `ver` int(11) default NULL
  7.   `createtime` datetime default NULL
  8.   `updatetime` datetime default NULL
  9.   `game_id` int(2) NOT NULL default '0'
  10.   `server_id` varchar(2) NOT NULL default ''
  11.   `server_name` varchar(40) NOT NULL default ''
  12.   PRIMARY KEY  (`id`), 
  13.   UNIQUE KEY `game_id_server_id` (`game_id`,`server_id`), 
  14.   UNIQUE KEY `game_id_server_name` (`game_id`,`server_name`) 
  15. ) ENGINE=InnoDB DEFAULT CHARSET=gbk 
  16. --Vevb.com 
  17.  
  18. 1 row in set (0.00 sec) 

因為有外鍵的存在,所以我不想改變字段類型,費勁啊,呵呵,雖然最后我還是選擇了更改字段類型,這是后話,因為我本篇日志想要說明的是varchar排序問題,所以不再說明我是如何更改字段類型的,大家有興趣可以搜索我以前的日志.

現象描述:下面,我從數據庫里面以server_id排一下序,大家來看一下排序后的結果,代碼如下:

  1. select server_id from cardserver where game_id = 1 order by server_id desc limit 10; 
  2. +-----------+ 
  3. | server_id | 
  4. +-----------+ 
  5. | 8         |  
  6. | 7         |  
  7. | 6         |  
  8. | 5         |  
  9. | 4         |  
  10. | 3         |  
  11. | 2         |  
  12. | 10        |  
  13. | 1         |  
  14.  
  15.  
  16. +-----------+ 

很明顯,我想要的結果應該是 10,8,7,6,5 這樣的,但是這個10排在了2的后面,按照字符串來排的,其實我是想把它當做數值來排.

手動轉換類型:用下面的方法就可以了,使server_id+0之后再排序,問題解決了,代碼如下:

  1. select server_id from cardserver where game_id = 1 order by server_id+0 desc limit 10; 
  2. +-----------+ 
  3. | server_id | 
  4. +-----------+ 
  5. | 10        |  
  6. | 8         |  
  7. | 7         |  
  8. | 6         |  
  9. | 5         |  
  10. | 4         |  
  11. | 3         |  
  12. | 2         |  
  13. | 1         |  
  14. +-----------+  

使用MySQL函數CAST/CONVERT:mysql為我們提供了兩個類型轉換函數:CAST和CONVERT,現成的東西我們怎能放過?

CAST() 和CONVERT() 函數可用來獲取一個類型的值,并產生另一個類型的值.

這個類型 可以是以下值其中的一個:

  1. BINARY[(N)] 
  2. CHAR[(N)] 
  3. DATE 
  4. DATETIME 
  5. DECIMAL 
  6. SIGNED [INTEGER
  7. TIME 
  8. UNSIGNED [INTEGER

所以我們也可以用CAST解決問題,代碼如下:

  1. select server_id from cardserver where game_id = 1 order by CAST(server_id as SIGNED) desc limit 10; 
  2. +-----------+ 
  3. | server_id | 
  4. +-----------+ 
  5. | 10        |  
  6. | 8         |  
  7. | 7         |  
  8. | 6         |  
  9. | 5         |  
  10. | 4         |  
  11. | 3         |  
  12. | 2         |  
  13. | 1         |  
  14. +-----------+ 

也可以使用CONVERT來搞定此問題,代碼如下:

  1. select server_id from cardserver where game_id = 1 order by CONVERT(server_id,SIGNED) desc limit 10; 
  2. +-----------+ 
  3. | server_id | 
  4. +-----------+ 
  5. | 10        |  
  6. | 8         |  
  7. | 7         |  
  8. | 6         |  
  9. | 5         |  
  10. | 4         |  
  11. | 3         |  
  12. | 2         |  
  13. | 1         |  
  14. +-----------+  

總結:方法有很多要看自己動腦子了,所謂的條條大道通羅馬也是這個意思了.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 济宁市| 九江市| 水富县| 娄底市| 外汇| 钟山县| 太和县| 南华县| 洪洞县| 黄梅县| 安龙县| 琼海市| 铜川市| 页游| 武清区| 上林县| 河南省| 寻甸| 错那县| 定安县| 广南县| 托里县| 芦山县| 司法| 普洱| 湘西| 郧西县| 蕉岭县| 夏邑县| 永新县| 钟祥市| 平罗县| 蒙山县| 阿巴嘎旗| 哈密市| 清苑县| 龙胜| 班戈县| 新河县| 鸡东县| 南木林县|