Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.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/2/ssis/2.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
用数字-1,2,3,4等代替1,10,11,12进行排序的SQL_Sql_Sql Order By - Fatal编程技术网

用数字-1,2,3,4等代替1,10,11,12进行排序的SQL

用数字-1,2,3,4等代替1,10,11,12进行排序的SQL,sql,sql-order-by,Sql,Sql Order By,我正在尝试按数据库中的数字列排序,该列的值为1-999 当我使用 ORDER_BY registration_no ASC 我得到 1 101 102 103 104 105 106 107 108 109 11 110 Etc… 因此,它似乎是按第一位数字排序,而不是按数字排序 如果我想按值排序,有人知道使用什么SQL吗?所以1,2,3,4,5,6等 ORDER_BY cast(registration_no as unsigned) ASC 将值显式转换为数字。实现同样目标的另一种可能

我正在尝试按数据库中的数字列排序,该列的值为1-999

当我使用

ORDER_BY registration_no ASC
我得到

1
101
102
103
104
105
106
107
108
109
11
110
Etc…
因此,它似乎是按第一位数字排序,而不是按数字排序

如果我想按值排序,有人知道使用什么SQL吗?所以
1,2,3,4,5,6

ORDER_BY cast(registration_no as unsigned) ASC
将值显式转换为数字。实现同样目标的另一种可能性是

ORDER_BY registration_no + 0 ASC
这将迫使进行含蓄的对话

实际上,您应该检查表定义并对其进行更改。您可以像这样将数据类型更改为
int

ALTER TABLE your_table MODIFY COLUMN registration_no int;

我假设您的列类型是STRING(CHAR、VARCHAR等),排序过程是将其作为字符串排序。您需要做的是将值转换为数值。如何操作取决于您使用的SQL系统。

当正整数存储为
varchar
时,按正整数排序的一种方法是先按长度排序,然后按值排序:

order by len(registration_no), registration_no
当列可能包含非数值时,这尤其有用


注意:在某些数据库中,获取字符串长度的函数可能被称为
length()
,而不是
len()

如果您使用的是SQL Server:

ORDER_BY cast(registration_no as int) ASC
比起数据,我更喜欢做“PAD”。MySql将其称为LPAD,但您可以在SQL Server中以自己的方式进行同样的操作

ORDER BY  REPLACE(STR(ColName, 3), SPACE(1), '0') 
此公式将根据列的长度3提供前导零。此功能在ORDER BY之外的其他情况下非常有用,因此我希望提供此选项


结果:1变为001,10变为010,100不变

有时候,你没有选择,只能将数字与文本混合存储。在我们的一个应用程序中,我们用于电子商务站点的web站点主机会动态地从列表中筛选。除了显示的文本外,没有按任何字段排序的选项。当我们需要过滤器时,我们会根据一个列表构建过滤器 2“至8” 9“至12” 13“到15”等等,我们需要它来排序2-9-13,而不是像读取数值时那样排序13-2-9。因此,我使用SQL Server复制函数以及最长数字的长度,用前导空格填充任何较短的数字。现在20在3之后排序,以此类推

我使用的视图为项目类型和类提供了最小和最大长度、宽度等,下面是我如何编写文本的示例。 (LBnLow和LBnHigh是5个长度支架的低端和高端。)

给出所需的结果并给出警告

因此,最好去

ORDER_BY registration_no + 0 ASC

获取没有任何SQL警告的干净结果。

此问题只是因为您已在CHAR、VARCHAR或TEXT数据类型中声明了列。只需将数据类型更改为INT,BIGINT等。这将解决您的自定义排序问题。

您的列是varchar类型,因此您面临此行为。注册列的数据类型是什么?请使用
按注册排序+0 asc
解决您的问题。您不应在字符列中存储数字。您的问题是该错误的直接结果。我的列是Varchar,存储的数据是Class 10/Class 9/Class 8。现在十班在八班之前。我如何解决这个问题,而不必为显示顺序列进行输入?这在所有情况下都不起作用。不经意间,行不通的案例是整数和数字的混合;负数、带前导零的数、带分数的数、字和数的组合。@Knickerless Noggins。阅读答案的第一句。我想这很清楚。@GordonLinoff是按同一列两次排序的,不是cpu和内存密集型的吗?@Achyuth。按排序的
中的键数对性能几乎没有影响。对于Oracle SQL,请使用
length()
而不是
len()
您能解释为什么使用
+0
有效吗?我已经在我的数据集上测试了它,它确实有效,但我很好奇为什么?订购前是否将其转换为数字?
ORDER_BY cast(registration_no as unsigned) ASC
ORDER_BY registration_no + 0 ASC