m88体育

今天为一个网站改数据,遇到个小问题。

m88体育 从数据库中提取一系列记录,其中一列是一个业务编号,为通用性考虑,这一列采用了字符串类型,而其内容却是数字,比如"1","2","12"等等。今天删除了某些记录,又新加入了一些,所以这一列的顺序相对于主关键字来说就混乱了。m88体育 提取的数据需要按这一列排序,于是就简单写了个查询:

SELECT product_type_label, product_name FROM product 
    WHERE product_type = 'ENTREES' 
    ORDER BY product_type_label;

结果自然是错的:

1만두 Raviolis 餃子
10떡볶이 Toppokki トッポッキ
11Boulots assaisonnés
12육회 Steak tartare coréen ユッケ
13닭볶음면 Nouilles sautées avec poulet チキン焼きそば
14Assortiment de beignets
2김밥 Maki coréen のり巻き
3김치전 Kimchijeon キムチジョン
4해물 파전 Crêpe coréenne de fruits de mer 海鮮チヂミ
5잡채 Jabchai チャプチェ
6깐풍기 Sauté de poulet カンプンギ
7오징어 볶음 Sauté de calamar piquant
8새우튀김 Beignets de crevettes 天ぷら
9김치돼지볶음 Sauté de Kimchi avec porc キムチ豚炒め

因为那一列既然是字符串类型,那么当然用字典排序法排序,所以"1"之后是"10",而"2"要排在所有以'1'开头的数字之后。解决办法比较讨巧,那就是先按字符串长度排序,然后再排内容:

SELECT product_type_label, product_name FROM product 
    WHERE product_type = 'ENTREES' 
    ORDER BY LENGTH(product_type_label), product_type_label;

正确结果:

1만두 Raviolis 餃子
2김밥 Maki coréen のり巻き
3김치전 Kimchijeon キムチジョン
4해물 파전 Crêpe coréenne de fruits de mer 海鮮チヂミ
5잡채 Jabchai チャプチェ
6깐풍기 Sauté de poulet カンプンギ
7오징어 볶음 Sauté de calamar piquant
8새우튀김 Beignets de crevettes 天ぷら
9김치돼지볶음 Sauté de Kimchi avec porc キムチ豚炒め
10떡볶이 Toppokki トッポッキ
11Boulots assaisonnés
12육회 Steak tartare coréen ユッケ
13닭볶음면 Nouilles sautées avec poulet チキン焼きそば
14Assortiment de beignets

提交评论