【问题标题】:ORDER BY column containing a mix of text and numerical dataORDER BY 列包含文本和数字数据的混合
【发布时间】:2012-05-11 06:02:43
【问题描述】:

我想对文本列进行排序,其中数字组件应按数字排序。排序后的结果应该是这样的:

chr1
chr1,chr1
chr1,chr2
chr1,chr10
chr2
chr2,chr1
chr2,chr2
chr2,chr10
chr6
chr6,chr1
chr6_ux9
chr6_ux9,chr1
chr7
chr10
chr10,chr1
chr10,chr2
chr10,chr10
chr21
chr21,chr1
chr21,chr2
chr21,chr10
chrx
chrx,chr1
chrx,chr2
chrx,chr10
chry
chry,chr1
chry,chr2
chry,chr10
chrmt
chrmt,chr1
chrmt,chr2
chrmt,chr10
chr25
chr25,chr1
chr25,chr2
chr25,chr10

以下规则适用:

  1. chrx 被视为chr22
  2. chry 被视为 chr23
  3. chrmt 被视为chr24
  4. chr6_ux9 是一个特殊情况,应该在 chr6 之后

我尝试了不同的方法,但无法找到完美的解决方案。如果有人有想法,请帮助我。

【问题讨论】:

  • 应该按列排序还是整体排序?像文本一样对数字进行排序?请澄清结果应该是什么样子,并将数据量减少到问题所需的量。
  • 整张表应按此列排序。
  • 我需要进行字母数字排序
  • 看起来像染色体数据,对吧?我在您的问题尚不清楚的地方使用了我的幻想,并相应地添加了phantastic 解决方案。
  • 这是一种可怕的数据存储方式。将您的数据库(或至少此列)重新设计为您需要的单独信息。

标签: sql arrays postgresql replace sql-order-by


【解决方案1】:

认为我现在明白了,你在找什么。您希望数字组件按数字排序,而不是字符串。这应该适合你:

SELECT col1
FROM   tbl
ORDER  BY string_to_array(
             replace(replace(replace(replace(replace(replace(
                col1
              , 'chrx',     'chr22')
              , 'chry',     'chr23')
              , 'chrmt',    'chr24')
              , 'chr6_ux9', 'chr6.6')
              , ' chr',     'chr')
              , 'chr',      '')
           , ',')::real[];

按照问题中的描述对列进行排序。文本组件('chr')原来是多余的噪音。应用所有替换后,我去除噪声并转换为可在 ORDER BY 子句中使用的数字数组。

在执行列出的替换时,chr6_ux9 的特殊情况会强制使用real[],而不是更简单、更快速的int[],因为integer 类型在67 之间没有空间.您还有一列带有空格而不是逗号。我也添加了一个替代品。但这可能只是一个错字。去掉不相关的字符串chr后,只剩下逗号分隔的数字,可以转换成real[]

顺便说一句,replace() 非常快。我有数十个 replace() 连续操作的函数,它们仍然执行得很快。 (regexp_replace() 慢得多。)


对单个元素进行排序的替代答案

对于所有值作为字符串的排序输出:

SELECT regexp_split_to_table(replace(replace(replace(
          col1
        ,'chrx', 'chr22')
        ,'chry', 'chr23')
        ,'chrmt', 'chr24')
        , ',') AS col1
FROM   tbl
ORDER  BY 1

chr6_ux9 在这种情况下自动出现在chr6 之后。

【讨论】:

  • 感谢 Erwin,您的快速回复。我尝试了您的代码,但无法进行字母数字排序
  • 谢谢欧文。您的解决方案运行良好。事实上,我在过去 3 天里一直在努力寻找解决方案。你给了我一个很好的解决方案。
【解决方案2】:

可以说不是一个完美的数据模型...您应该使用适当的规范化模型来解决这个问题,但您也可以使用array datatype。可以对数组进行排序、索引等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多