Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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
如何在Sql Server中为主键指定自定义排序顺序_Sql_Sql Server_Database_Primary Key - Fatal编程技术网

如何在Sql Server中为主键指定自定义排序顺序

如何在Sql Server中为主键指定自定义排序顺序,sql,sql-server,database,primary-key,Sql,Sql Server,Database,Primary Key,我将列类型为varchar的表作为主键;主索引也是聚集索引。主键的值以I或X作为前缀,后跟递增的数字I1、I2、I3、…、X1、X2、X3、。。。。当前的默认排序类似于I1、I11、I111、I2、I21、I22等 在创建键并将其插入到树中时,是否有任何方法可以通过数字顺序指定主键列的排序顺序;不在选择查询时间?所以排序顺序是I1,I2,I3,…,I11,I12,I13 谢谢您可以尝试仅使用列的数字部分进行排序,强制转换为整数: SELECT * FROM yourTable ORDER BY

我将列类型为varchar的表作为主键;主索引也是聚集索引。主键的值以I或X作为前缀,后跟递增的数字I1、I2、I3、…、X1、X2、X3、。。。。当前的默认排序类似于I1、I11、I111、I2、I21、I22等

在创建键并将其插入到树中时,是否有任何方法可以通过数字顺序指定主键列的排序顺序;不在选择查询时间?所以排序顺序是I1,I2,I3,…,I11,I12,I13


谢谢

您可以尝试仅使用列的数字部分进行排序,强制转换为整数:

SELECT *
FROM yourTable
ORDER BY CAST(SUBSTRING(col, 2, LEN(col)-1) AS INT);
这将分类如下:

I1
X1
I11
X11
如果还想将I和X字段分开,可以向ORDER BY子句添加另一个级别:


这里真正的问题是,您将文本和数字存储为单个列中的文本。最好使用数字ID列和单独的文本列。

您可以尝试仅使用列的数字部分进行排序,强制转换为整数:

SELECT *
FROM yourTable
ORDER BY CAST(SUBSTRING(col, 2, LEN(col)-1) AS INT);
这将分类如下:

I1
X1
I11
X11
如果还想将I和X字段分开,可以向ORDER BY子句添加另一个级别:


这里真正的问题是,您将文本和数字存储为单个列中的文本。最好有一个数字ID列和一个单独的文本列。

如果要先用“I”对前缀排序,然后用“X”对前缀排序,请尝试此操作。 示例:I1、I2、I3、…、X1、X2、X3、

样本数据

I1, I11, I2, I3, I111, I2, I21, I22, ..., X1, X2, X3
I1, I11, I2, I3, I111, I2, I21, I22, ..., X1, X2, X3
结果顺序

I1, I2, I2, I3, I11, I21, I22, I111,  ..., X1, X2, X3
I1, X1, I2, I2, X2, I3, X3, I11, I21, I22, I111,  ...
但是,如果您想忽略前缀而只是排序…,那么请尝试以下方法。 例如:I1,X1,I2,X2,I3,X3

样本数据

I1, I11, I2, I3, I111, I2, I21, I22, ..., X1, X2, X3
I1, I11, I2, I3, I111, I2, I21, I22, ..., X1, X2, X3
结果顺序

I1, I2, I2, I3, I11, I21, I22, I111,  ..., X1, X2, X3
I1, X1, I2, I2, X2, I3, X3, I11, I21, I22, I111,  ...

如果我没有正确理解,或者查询不起作用,请告诉我。

如果要先用“I”对前缀排序,然后用“X”对前缀排序,请尝试此操作。 示例:I1、I2、I3、…、X1、X2、X3、

样本数据

I1, I11, I2, I3, I111, I2, I21, I22, ..., X1, X2, X3
I1, I11, I2, I3, I111, I2, I21, I22, ..., X1, X2, X3
结果顺序

I1, I2, I2, I3, I11, I21, I22, I111,  ..., X1, X2, X3
I1, X1, I2, I2, X2, I3, X3, I11, I21, I22, I111,  ...
但是,如果您想忽略前缀而只是排序…,那么请尝试以下方法。 例如:I1,X1,I2,X2,I3,X3

样本数据

I1, I11, I2, I3, I111, I2, I21, I22, ..., X1, X2, X3
I1, I11, I2, I3, I111, I2, I21, I22, ..., X1, X2, X3
结果顺序

I1, I2, I2, I3, I11, I21, I22, I111,  ..., X1, X2, X3
I1, X1, I2, I2, X2, I3, X3, I11, I21, I22, I111,  ...

如果我没有正确理解,或者查询不起作用,请告诉我。

可能重复的井这就是将两个数据放入一个元组时发生的情况。您可能应该有两列和一个复合键。请记住,根据定义,表是一个无序集。当您从表中选择数据并应用order by子句时,就会出现顺序的概念。如果将两个数据放入一个元组中,就会出现可能的重复情况。您可能应该有两列和一个复合键。请记住,根据定义,表是一个无序集。当您从表中选择数据并应用ORDERBY子句时,就会出现order的概念。我可能错了,但我认为OP要求更改PK的存储方式,这意味着在键创建时。与查询时返回结果的方式无关。如果我错了,那么这个问题可能需要一些编辑。@TabAlleman有趣的回答,你可能是对的。但问题是,在一般意义上没有内部顺序,而作为文本,主键列不能按数字排序,留下order BY作为替代。确切地说,如果OP将PK与聚集索引混为一谈,正如我所怀疑的,然后,他们可能希望以这种方式对PK进行排序,以便在尝试按此顺序选择数据时减少碎片。但我想得越多,我就越觉得你的解释可能是正确的,问题只是需要澄清。我可能错了,但我认为OP是在询问改变PK的存储方式,也就是在密钥创建时。与查询时返回结果的方式无关。如果我错了,那么这个问题可能需要一些编辑。@TabAlleman有趣的回答,你可能是对的。但问题是,在一般意义上没有内部顺序,而作为文本,主键列不能按数字排序,留下order BY作为替代。确切地说,如果OP将PK与聚集索引混为一谈,正如我所怀疑的,然后,他们可能希望以这种方式对PK进行排序,以便在尝试按此顺序选择数据时减少碎片。但是我想得越多,我就越觉得你的解释可能是正确的,这个问题需要澄清。