如何根据值 B 对 sql 中的列进行排序,其中字段中的值格式为 A-B-C。我

Posted

技术标签:

【中文标题】如何根据值 B 对 sql 中的列进行排序,其中字段中的值格式为 A-B-C。我【英文标题】:How to sort a column in sql based on value B where values in fields are in format A-B-C. I w 【发布时间】:2017-08-31 06:56:39 【问题描述】:

我正在尝试对表中的列进行排序,其中列中的值采用00000197-001-00001 等格式。

我试过查询

select * from <table name> where <condition> order by column name.

值排序到00000197-099-001。但在此之后,我得到的值是 00000197-1000-001 在我的列表中,而不是 00000197-100-001 em>。

我得到的结果:

00000197-097-000001

00000197-098-000001

00000197-099-000001

00000197-1000-000001

00000197-100-000001

00000197-1001-000001

00000197-1002-000001

00000197-1003-000001

00000197-1004-000001

00000197-1005-000001

00000197-1006-000001

00000197-1007-000001

00000197-1008-000001

00000197-1009-000001

00000197-1010-000001

00000197-101-000001

00000197-1011-000001

00000197-1012-000001

预期结果:

00000197-097-000001

00000197-098-000001

00000197-099-000001

00000197-100-000001

00000197-101-000001

.

.

.

00000197-999-000001

00000197-1000-000001

00000197-1001-000001

00000197-1002-000001

00000197-1003-000001

.

.

.

请提出解决方案。 非常感谢。

【问题讨论】:

【参考方案1】:

试试这个

SELECT *
  FROM MyTable1
 ORDER BY CAST(SUBSTRING(SUBSTRING(MyCol1, CHARINDEX('-', MyCol1, 0) + 1, 100), 0, CHARINDEX('-', substring(MyCol1, CHARINDEX('-', MyCol1, 0) + 1, 100), 0)) as int)

这适用于 X-Y-Z 格式的任意长度的每个字符串。

【讨论】:

这对我没有帮助,我现在得到的结果如下:00000197-097-000001 00000197-098-000001 00000197-099-000001 00000197- 1007-000001 00000197-1003-000001 00000197-1009-000001 00000197-100-000001 00000197-1002-000001 00000197- 100000197-1000197-1000197-1000197-1000197-1000197-1000197-1000100197-1000100197-1000197-1000197-1000197-1000197-100000100197-1000197-1000197-1000197-1000197-100000100197-1016-000001 00000197-1018-000001 00000197-1018-00000100197-1018-00000100197-1018-00000100197-1018-00000197-10101800197-1010-00000197-1010-00000197-1010-00000197-1010-000001 是的,我没有在您的示例数据中看到超过 1000 的数字。我已经更新了答案。 这对我也不起作用。我在这个查询中遇到错误。对于 CAST,我得到: CAST 函数需要 1 个参数。对于 Select(CAST 附近):Select 附近的语法不正确。我还提供了列名来代替@MyCol,并且我收到了无效的列名错误。最后还有一个额外的右括号。 Thers 'as int' 在最后(我在中间有 @ char),现在试试【参考方案2】:

根据您的示例数据,您可以:

order by len(column1), column1

这个想法适用于任何数据库,尽管长度函数可能是length() 而不是len()

【讨论】:

以上是关于如何根据值 B 对 sql 中的列进行排序,其中字段中的值格式为 A-B-C。我的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL Server 中连接字符串,并按不同的列排序/排序?

如何根据基于其他列的列对数据框进行排序[重复]

java - 如何对Java中的列组合排序火花数据框?

如何根据行日差和分区对 SQL 中的列进行排名?

如何根据多列对 flex 数据网格进行排序?

如何在 Spark 中对包含日期和时间值的列进行排序?