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

标签 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 CAST(SUBSTRING(col, 2, LEN(col)-1) AS INT);

排序如下:

I1
X1
I11
X11

如果您还想将 IX 字段分开,您可以在 ORDER BY 子句中添加另一个级别:

ORDER BY
    LEFT(col, 1),
    CAST(SUBSTRING(col, 2, LEN(col)-1) AS INT);

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

关于sql - 如何在Sql Server 中为主键指定自定义排序顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50135755/

相关文章:

sql-server - 更改现有约束/规则/程序的 Quoted_Identifier

sql - 在一个存储过程中选择和更新

php - 当数据库结构在版本之间发生变化时如何升级Magento?

c# - 在 Access 中针对(隐藏的)系统表运行 C# 查询?

sql - 先进先出 (FIFO) 库存成本核算

sql - 获取每个 ID 的最新状态和日期

mysql - 使用 MySQL EXPLAIN 优化查询

mysql - Wordpress 数据库查询 - 根据其他两列从行中获取最新值

sql - 将日期转换为 YYYYMM 格式

sql - 获取 SQL 周数