SQL排序字符串,首先是数字特定模式

时间:2013-12-11 08:17:32

标签: mysql sql sql-order-by case

我有一个包含列(cat_name)的表。有些是字符串后跟数字,其他字符串只是普通字符串。我喜欢通过首先将所有字符串以“Level”开头来安排它。

期望的输出:

  • 1级物品
  • 2级物品
  • 3级物品
  • 等级5项
  • 等级10项
  • 等级12项
  • 等级22项
  • 苹果
  • 芒果
  • 其他
  • 特殊物品

我使用了这个查询

SELECT * FROM category ORDER BY
(CASE WHEN cat_name LIKE 'Level%' THEN 0
ELSE 1
END) ASC, cat_name

得到了

  • 1级物品
  • 等级10项
  • 等级12项
  • 2级物品
  • 等级22项
  • 3级物品
  • 等级5项
  • 苹果
  • 芒果
  • 其他
  • 特殊物品

在stackoverflow中找到此查询以进行自然排序

SELECT * FROM category WHERE cat_name LIKE 'Level%' ORDER BY LEFT(cat_name,LOCATE(' ',cat_name)), CAST(SUBSTRING(cat_name,LOCATE(' ',cat_name)+1) AS SIGNED), cat_name ASC

但我不知道如何将它与我的第一个查询集成。我能得到的最接近的是

SELECT * FROM category ORDER BY LEFT(cat_name,LOCATE(' ',cat_name)), CAST(SUBSTRING(cat_name,LOCATE(' ',cat_name)+1) AS SIGNED),
(CASE WHEN cat_name LIKE 'Level%' THEN 0
ELSE 1
END) ASC, cat_name ASC

但是Levels的字符串是关闭的。它按数字排列,但不占据最高位置。

  • 苹果
  • 芒果
  • 其他
  • 1级物品
  • 2级物品
  • 3级物品
  • 等级5项
  • 等级10项
  • 等级12项
  • 等级22项
  • 特殊物品

我想我在这里错过了一些东西。希望可以有人帮帮我。提前谢谢!

sqlfiddle:http://sqlfiddle.com/#!2/5a3eb/2

4 个答案:

答案 0 :(得分:2)

尝试:

SELECT * FROM category 
ORDER BY (CASE WHEN cat_name LIKE 'Level%' THEN 0
ELSE 1
END)ASC,
LEFT(cat_name,LOCATE(' ',cat_name)), CAST(SUBSTRING(cat_name,LOCATE(' ',cat_name)+1) AS SIGNED),
  cat_name ASC

这与ORDER BY

中的陈述顺序有关

答案 1 :(得分:1)

你也可以使用这样的东西 -

SELECT * FROM category
ORDER BY
  IF(cat_name REGEXP '^(Level )[0-9]+( Items)$', 0, 1),
  TRIM(LEADING 'Level ' FROM cat_name)*1,
  cat_name

答案 2 :(得分:0)

试试这个

SELECT * 
FROM category 
ORDER BY (CASE WHEN cat_name LIKE 'Level%' THEN 0 ELSE 1 END) ASC, 
    LEFT(cat_name,LOCATE(' ',cat_name)), 
    CAST(SUBSTRING(cat_name,LOCATE(' ',cat_name)+1) AS SIGNED), cat_name ASC

答案 3 :(得分:0)

只需按表达式将第一个订单添加到第二个查询:) http://sqlfiddle.com/#!2/5a3eb/24

SELECT * FROM category 
ORDER BY 
(CASE WHEN cat_name LIKE 'Level%' THEN 0
ELSE 1
END),
LEFT(cat_name,LOCATE(' ',cat_name)), 
CAST(SUBSTRING(cat_name,LOCATE(' ',cat_name)+1) AS SIGNED)
, cat_name ASC