【问题标题】:Order by only the numeric part of a string仅按字符串的数字部分排序
【发布时间】:2012-09-14 07:34:05
【问题描述】:

我有一个名为 Number 的列填充了这些数据(列是 nchar):

1
2
1091
3
20
2B

我想要一个给出这个顺序的 select 语句:

1
2
2B
3
20
1091

我怎样才能做到这一点?谢谢大家的帮助

(已编辑)

【问题讨论】:

  • 一个将值从 2B 更改为 3B 的订单?
  • 在第一部分你有 2B 在第二个 3B。错字?
  • 你能解释一下这个排序背后的逻辑吗?据我所知,无法指示 SQL 执行您的要求。
  • 我假设那里有几个错别字。
  • 你到底为什么要把它存储为nchar?我质疑固定长度和 Unicode 的必要性。

标签: sql sql-server-2008


【解决方案1】:

在发现第一个非数字的位置后,您可以通过转换为数字来执行一些技巧。在末尾附加一个随机字符,即使原始字符串不包含字母,它也会将所有字符串视为相同。

SELECT [Number] FROM dbo.TableName 
ORDER BY CONVERT(INT, LEFT(Number, PATINDEX('%[^0-9]%', Number + 'z')-1));

【讨论】:

  • Aaron - 我确实认为让未来的访问者使用正确的术语很重要。有时,文档链接是一种奖励,而这种情况几乎是必需的。搜索Sql Serverconvert 会产生很多错误命中。我认为它会转换为整数。你表情中的-1 完全让我感到困惑。如果代码执行我/认为/它执行的操作——也就是说,只提取Number 的数字部分,然后32a32fred32c 将出现无序——因为字母部分不考虑。
  • @Jeremy 一个编码问题的解决方案不应该包含解决方案中使用的每个函数的定义。我真的需要写一段关于 CONVERT 的作用吗? OP 肯定不这么认为,你可能也是唯一一个会期待的读者。如果需要进一步排序,则应在问题中说明。如果我 假设 如您所建议的那样,应该需要进行某种排序,那么答案会比 OP 所要求的更多。所以最后,我认为这个答案是否比你指向 Oracle 和 MySQL 自然排序更能帮助 OP?是的。
  • @AaronBertrand -- 所以最后,我认为这个答案是否比您指向 Oracle 和 MySQL 自然排序更能帮助 OP?是的 这从来没有被讨论过。
  • @Jeremy 很肯定在下面你说指向文档的答案比“魔法咒语”更好......如果你不认为你还建议你的答案与自然连接技术的链接其他 RDBMS 也更好?
  • @AaronBertrand -- 由于您提供了一个确切的解决方案,而我只能提供一个这是您寻找答案的下一步,毫无疑问,您的答案更好。 然而 - 没有出现正确的答案,那么术语 Natural Sort (我提供)至少会为 OP 提供他需要的名称。根据他的研究和数据库技能,OP 可以使用我指出的技术来形成他自己的解决方案。
【解决方案2】:

您要查找的内容称为自然排序,它不同于大多数系统提供的常规排序。我在 Stack Overflow 上找到了一些帖子,其中涵盖了各种流行的 SQL 引擎中的自然排序,包括一个关于 SQL Server 的简短讨论。

这里的想法可能会帮助您着手解决问题。

Oracle: How can I implement a "natural" order-by in a SQL query?

不过,您可能必须更改 SQL 引擎的语法。

找到另一个 MYSQL 版本:

Natural Sort in MySQL

目前还找不到任何 SQL Server。

编辑3

啊,这个也涵盖了一些 SQL Server 的想法:

Natural Sort in MySQL

【讨论】:

  • @AaronBertrand -- OP 需要自然排序,尽管 OP 没有使用我的名字这个词。由于 SQL 引擎没有内置的自然排序,因此必须使用表达式进行排序。我的链接涵盖了人们在各种形式的 SQL 中获得自然排序的不同方式。其中之一本可以改编。
  • 好吧,他们在 Oracle 或 MySQL 中不需要它,而且正如您所建议的,MySQL 的答案似乎也没有任何适用于 SQL Server 的有效答案。我找到的最接近的是一个包含 MID 的函数,但这是一个 Access 函数,而不是 SQL Server。
【解决方案3】:

使用 PATINDEX,检查此 SQL Fiddle 代码。 @AaronBertrand 刚刚在我测试时回答。

只是为了添加更多价值和信息,请查看this SQLServerCentral link,因为在那里您可以找到更多答案。

并检查这个Natural (human alpha-numeric) sort in Microsoft SQL 2005,有很多有用的答案和变化。

【讨论】:

  • 一些反对者可以评论什么是错的吗?我只是在已经有用的答案上添加了更多信息...谢谢
  • EH,有人对这个问题投了反对票。为提供文档而 +1,而不仅仅是一个神奇的咒语答案。
  • 我(还)没有投反对票,但通常如果您尝试向现有答案添加信息,则添加评论,而不是附加答案。
  • @AaronBertrand,当您发布答案时,我正要发布我的答案,请查看时差。然后我花了一些时间添加这些链接。这不是我第一次看到相同或几乎相同的答案,但差异不到一分钟。甚至像“击败我 X 秒”之类的 cmets。
  • @JeremyJStarcher 这个页面上的什么答案来自魔法咒语?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-20
  • 2014-02-21
  • 1970-01-01
  • 1970-01-01
  • 2016-12-24
  • 2021-12-20
  • 1970-01-01
相关资源
最近更新 更多