Mysql指定某個字符串字段前面幾位排序查詢方式

指定某個字符串字段前面幾位排序查詢

數據樣例

想要結果: 

每個test_value 裡面都包含 ORDER 關鍵字, 想根據這個關鍵字 前面的數字進行排序。

第一步(想辦法先截取到 ORDER關鍵字前面的 值)

使用SUBSTRING_INDEX 函數

sql :

SELECT ID,SUBSTRING_INDEX(test_value,"ORDER",1) AS NO, test_value  FROM  test

結果:

第二步,直接根據NO排序即可? (有坑)

sql :

select * FROM (

SELECT ID,SUBSTRING_INDEX(test_value,"ORDER",1) AS NO, test_value  FROM  test

)t  ORDER BY t.NO DESC 

結果並不是我們想要的:

原因,之前講過,字符串類型對應mysql排序,它是這樣排的:

所以我們需要做轉換成數字再排 。

第三步轉換排序 

第一種方案 :

使用  CAST函數 轉換類型 

  • unsigned 表示無符號,不能表示小數
  • signed 表示有符號,可以表示小數
SELECT * FROM (

SELECT ID,SUBSTRING_INDEX(test_value,"ORDER",1) AS NO, test_value  FROM  test

)t  ORDER BY  CAST(t.NO AS SIGNED) 

結果OK的:

第二種方案

排序的字符串字段值後拼接 0 ,觸發轉換成數字

sql:

SELECT * FROM (

SELECT ID,SUBSTRING_INDEX(test_value,"ORDER",1) AS NO, test_value  FROM  test

)t  ORDER BY  t.NO+0

結果是OK的:

第三種方案:

CONVERT 函數 轉換類型

  • unsigned 表示無符號,不能表示小數
  • signed 表示有符號,可以表示小數

sql:

SELECT * FROM (

SELECT ID,SUBSTRING_INDEX(test_value,"ORDER",1) AS NO, test_value  FROM  test

)t  ORDER BY  CONVERT(t.NO,SIGNED)

結果是OK的:

總結

好瞭,該篇到這裡吧~

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: