【问题标题】:SQL Query, Sort on SubstringSQL 查询,按子字符串排序
【发布时间】:2013-12-13 12:09:26
【问题描述】:

我想根据 Substring 对 SQL 查询返回的结果进行排序。我正在使用 MYSQL 作为数据库。我正在尝试实现两种不同的结果

Sample data
aaa ad aa
aaa ab
aaa ac

1) 首先我想根据第二个子字符串进行排序。

Result:
aaa ab
aaa ac
aaa ad aa

2) 其次,我想根据最后一个子字符串进行排序。

Result:
aaa ad aa
aaa ab
aaa ac

我怎样才能完成这些任务。

非常感谢您的帮助.. 问候

编辑 1:子字符串可以是任意长度。 同样对于第二种情况,我想根据最后一个子字符串进行排序。这意味着它可以在任何位置..

【问题讨论】:

  • 子字符串是固定长度/位置还是分隔?
  • 没有一个子字符串是固定长度的,在第二种情况下,我只想对最后一个子字符串进行排序,它可以在任何位置......
  • 我们如何知道我们应该在什么基础上对字符串进行排序?
  • 字母顺序....
  • 您似乎想要获取字符串,将其分解为分隔的部分,选择其中一个并根据它进行排序。这是可能的,但它不会漂亮或高效。

标签: mysql sql select sql-order-by substring


【解决方案1】:

试试这个:

对于问题 1:

SELECT * FROM tableA
ORDER BY SUBSTRING_INDEX(SUBSTRING_INDEX(colName, ' ', 2), ' ', -1);

对于问题 2:

SELECT * FROM tableA
ORDER BY SUBSTRING_INDEX(colName, ' ', -1);

【讨论】:

  • 第一个有问题,如果没有足够的分隔符将无法正确排序。例如,如果任何行只有 1 个子字符串,那么它将使用该子字符串对该行进行排序,而不是将其视为 null(或某些值,如果需要)。问题是 SUBSTRING_INDEX 将所有内容都获取到指定的索引。因此,如果使用“aaa ab”,如果您将所有内容都放在第 2 个空格内,它只会返回“aaa ab”,然后获取 -1 索引,它将返回“ab”作为第 3 个子字符串,而它只是第 2 个子字符串。
【解决方案2】:

一种方法:-

SELECT SampleData, IF (LENGTH(SampleData) - LENGTH(REPLACE(SampleData, ' ', '')) >= 2, SUBSTRING_INDEX(SUBSTRING_INDEX(SampleData, ' ', 2), ' ', -1), NULL) AS OrderField
FROM SampleTable
ORDER BY OrderField

检查该字段是否有足够的分隔符来获取相关部分。如果不将排序字段设置为 NULL,但如果足够长,则抓取该字段的那部分。然后根据它排序。

这里的 SQL 小提琴:-

http://www.sqlfiddle.com/#!2/8cd01/8

获取最后一个字段更容易:-

SELECT SampleData, SUBSTRING_INDEX(SampleData, ' ', -1) AS OrderField
FROM SampleTable
ORDER BY OrderField

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 2014-01-26
    • 1970-01-01
    • 2013-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多