×

消息

EU e-Privacy Directive

This website uses cookies to manage authentication, navigation, and other functions. By using our website, you agree that we can place these types of cookies on your device.

View e-Privacy Directive Documents

You have declined cookies. This decision can be reversed.

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

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

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

结果自然是错的:

1 만두 Raviolis 餃子
10 떡볶이 Toppokki トッポッキ
11 Boulots assaisonnés
12 육회 Steak tartare coréen ユッケ
13 닭볶음면 Nouilles sautées avec poulet チキン焼きそば
14 Assortiment 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 トッポッキ
11 Boulots assaisonnés
12 육회 Steak tartare coréen ユッケ
13 닭볶음면 Nouilles sautées avec poulet チキン焼きそば
14 Assortiment de beignets

提交评论


安全码
刷新