Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何按varchar字段作为编号排序?_Mysql_Sql - Fatal编程技术网

Mysql 如何按varchar字段作为编号排序?

Mysql 如何按varchar字段作为编号排序?,mysql,sql,Mysql,Sql,我在排序/排序方面有问题,无法按需要工作 SELECT `proc` FROM `table` ORDER BY `proc` DESC; 结果: 80.0 proc 70.0 proc 60.0 proc 50.0 proc 40.0 proc 200.0 proc 20.0 proc 190.0 proc 180.0 proc 170.0 proc 160.0 proc 150.0 proc 140.0 proc 130.0 proc 120.0 proc 110.0 proc 100.0

我在排序/排序方面有问题,无法按需要工作

SELECT `proc` FROM `table` ORDER BY `proc` DESC;
结果:

80.0 proc
70.0 proc
60.0 proc
50.0 proc
40.0 proc
200.0 proc
20.0 proc
190.0 proc
180.0 proc
170.0 proc
160.0 proc
150.0 proc
140.0 proc
130.0 proc
120.0 proc
110.0 proc
100.0 proc
我需要的是:

200.0 proc
190.0 proc
180.0 proc
170.0 proc
160.0 proc
150.0 proc
140.0 proc
130.0 proc
120.0 proc
110.0 proc
100.0 proc
90.0 proc
80.0 proc
70.0 proc
60.0 proc
50.0 proc
40.0 proc
20.0 proc

如何操作?

proc的列字段是一个VARCHAR或CHAR,它将其视为一个文本字符串——按字母顺序排序

将列转换为双精度、浮点或强制转换值

SELECT `proc` FROM `table` ORDER BY CAST(`proc` AS decimal) DESC;
它看起来像“proc”是一个字符串(
varchar
field),所以它按词汇顺序排列。如果是这样的话,你也许可以通过

SELECT `proc` FROM `table` ORDER BY convert(`proc`, decimal) DESC;

请注意,这样的查询速度会非常慢,对于任何严重的使用,最好使用数字列来存储数字数据。

您的表设计存在根本性的问题。不要在
VARCHAR
列中使用像
'80.0 proc'
这样的值,而应该将
80.0
保留在
REAL
类型的列中(或适合您的数据的任何合适的数字类型)。您可以进行动态转换,仅用于
ORDER BY
表达式中,但这也可能会降低查询的性能

在这里向文本中添加“proc”似乎没有什么用处,它还会阻止您进行简单的转换

令人惊讶的是(参见che的答案),显然,
convert(…,decimal)
能够忽略后面的垃圾。不过,总的来说,这不是你应该依赖的东西

问题并不是特别清楚。值得阅读该部分以了解字符串/数字的限制(通常会发生),例如:


如果这种行为发生了变化,您可能会在本例中使用
replace()
,只是为了摆脱
“proc”

对于更复杂的内容,您可能会使用正则表达式替换从字符串中提取数值,并在排序之前将其转换为数字,但这将非常笨拙(在其源代码处修复问题:您的列数据类型)


要处理遗留数据,您可以添加一个额外的列并使用外部程序(使用任何能够执行regexp替换的语言),这应该不会太困难。

如果您总是有相同数量的小数点,我的方法是:

SELECT `proc` FROM `table` ORDER BY LENGTH(proc) DESC, proc DESC;

听起来您使用的是
varchar
而不是
decimal
。列中的实际文本是否为
80.0 proc
?是的varchar,是的列包含文本:80.0 proc,等等。为什么它们都包含文本
proc
?甚至该列也被命名为
proc
?可能的重复-如果不起作用,请查看所有与之相关的问题。很好,但我无法更改它,需要一个解决方案。双精度或浮点值不能包含字母数字值,如“100.0 proc”。是的,如果可能,应适当更改列(并且,
'proc'
出现在每行中这一事实值得关注)。但是,根据实际存储的内容,浮点类型不是正确的选择-我可能建议使用整数类型(如果小数位数不重要)或十进制类型(如果需要精确的精度)。@Ray请先在服务器上检查您的答案,然后发布它显然有效,只有当我没想到这会起作用但很有趣时,我才会想到将“80.0 proc”转换为十进制会失败。有人知道为什么吗?@Bort:找不到这方面的任何规范,所以我猜他们选择了更宽松一点,而不是返回NULL,这可能是这些函数失败的唯一方法。@Bort:在我的测试中,函数好像一直读取字符串直到第一个“无效”字符,直到字符串不能再转换为十进制为止。它对可以转换的零件进行转换。公平的警告是,它认为“逗号”是无效字符,
CONVERT('123456.78',DECIMAL)
将返回
123
。在最初排序的字段是alpha的情况下,存在类似问题,例如数学、科学、动物学。然后决定某些项目的类别不起作用,因此将项目分为级别,例如级别1、级别2。然后他们决定,对于一个应用程序,他们只需对所有内容进行编号。因此,在数据库行的一半中,字段是一个varchar,而在另一半中,它实际上是一个整数。我使用的转换是按转换顺序(
group
,未签名),其中
app
='App1'
SELECT `proc` FROM `table` ORDER BY LENGTH(proc) DESC, proc DESC;