【问题标题】:How do I sort a VARCHAR column in PostgreSQL that contains words and numbers?如何在 PostgreSQL 中对包含单词和数字的 VARCHAR 列进行排序?
【发布时间】:2011-05-04 02:33:42
【问题描述】:

我需要使用 varchar 列,使用数字和文本顺序来订购选择查询。查询将在 java 程序中完成,使用 jdbc over postgresql。

如果我在我获得的选择子句中使用ORDER BY

1
11
2
abc

但是,我需要获得:

1
2
11
abc

问题是该列也可以包含文本。

这个问题类似(但针对 SQL Server):

How do I sort a VARCHAR column in SQL server that contains words and numbers?

但是,提出的解决方案不适用于 PostgreSQL。

提前致谢,问候,

【问题讨论】:

    标签: sql postgresql jdbc natural-sort


    【解决方案1】:

    我遇到了同样的问题,下面的代码解决了它:

    SELECT ...
      FROM table
      order by  
        CASE WHEN column < 'A' 
            THEN lpad(column, size, '0')
        ELSE column 
            END;
    

    大小 var 是 varchar 列的长度,例如 255 表示可变 (255)。

    【讨论】:

    • 请注意,这会在列的大小和排序之间产生依赖关系,如果更改列的大小,这将导致无法结束。
    【解决方案2】:

    我不知道有任何数据库具有“自然排序”,例如一些已知存在于 PHP 中的数据库。我发现的只是各种功能:

    【讨论】:

      【解决方案3】:

      你可以使用正则表达式来做这种事情:

      select THECOL from ...
      order by
        case
          when substring(THECOL from '^\d+$') is null then 9999
          else cast(THECOL as integer)
        end,
        THECOL
      

      首先你使用正则表达式来检测列的内容是否为数字。在这种情况下,我使用 '^\d+$' 但您可以根据情况对其进行修改。

      如果正则表达式不匹配,则返回一个大数字,因此该行将落到订单的底部。

      如果正则表达式匹配,则将字符串转换为数字,然后对其进行排序。

      在此之后,按列定期排序。

      【讨论】:

      • 当您停止寻找最佳解决方案并决定解决方法时,您就会找到正确的解决方案。先生,我的帽子向您致敬,谢谢!
      • 但是这样排序不对,不是吗? A2, B1 — 它会出现 B1, A2
      猜你喜欢
      • 1970-01-01
      • 2010-09-12
      • 2018-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-27
      • 2013-10-16
      • 1970-01-01
      相关资源
      最近更新 更多