【问题标题】:SQL Alphanumeric Sort on VARCHAR ColumnVARCHAR 列上的 SQL 字母数字排序
【发布时间】:2016-10-18 00:19:07
【问题描述】:

我正在处理需要按字母排序然后按数字排序的字母数字列值。

数据示例:

  • a1
  • a10
  • a11
  • ab2
  • ab21
  • ab22
  • a1a
  • a1b

需要进行如下排序:

  • a1
  • a1a
  • a1b
  • a2
  • a3
  • ab1
  • ab2
  • ab3
  • ...

需要有关如何在 SQL 中对其进行排序的建议。

谢谢。

【问题讨论】:

  • 字符串格式是否一致?还有正在使用的 dbms 是什么?
  • 不完全是,数字部分前面有 1-3 个字母。
  • 请用您正在使用的数据库标记您的问题。
  • 这是一个 VARCHAR 字段吗?它不适用于常规的ORDER BY 子句吗?如果不是,排序规则是什么?
  • 这是一个 VARCHAR 字段,但是您最终会得到 1、10、11、2、20、21 而不是 1、2、3 等。

标签: sql sql-server sorting alphanumeric


【解决方案1】:

以下内容可能适用于字母数字。但是请注意,非字母数字值的行为未定义。

WITH A (A, N) AS (
    SELECT A, 3 + LEN(A) FROM (
        SELECT 'a1'
        UNION ALL
        SELECT 'a10'
        UNION ALL
        SELECT 'a11'
        UNION ALL
        SELECT 'ab2'
        UNION ALL
        SELECT 'ab21'
        UNION ALL
        SELECT 'ab22'
        UNION ALL
        SELECT 'a1a'
        UNION ALL
        SELECT 'a1b'
        UNION ALL
        SELECT 'a1'
        UNION ALL
        SELECT 'a1a'
        UNION ALL
        SELECT 'a1b'
        UNION ALL
        SELECT 'a2'
        UNION ALL
        SELECT 'a3'
        UNION ALL
        SELECT 'a9'
        UNION ALL
        SELECT 'ab1'
        UNION ALL
        SELECT 'ab2'
        UNION ALL
        SELECT 'ab3'
    ) T (A)
), B (A, N, I, C, D, X) AS (
    SELECT A, N, 3, CAST(SUBSTRING(A, 1, 1) AS VARCHAR(255)), CAST(SUBSTRING(A, 2, 1) AS VARCHAR(255)), CAST('' AS VARCHAR(255)) FROM A
    UNION ALL
    SELECT A, N, I + 1, D, CAST(SUBSTRING(A, I, 1) AS VARCHAR(255)), CASE WHEN ASCII(C) BETWEEN 48 AND 57 AND ASCII(D) BETWEEN 48 AND 57 THEN CAST(X + CHAR(10 + ASCII(D)) AS VARCHAR(255)) WHEN 58 > ASCII(C) THEN CAST(X + C AS VARCHAR(255)) ELSE CAST(X + CHAR(3 + ASCII(C)) AS VARCHAR(255)) END FROM B WHERE I <= N
)
SELECT A FROM B WHERE I = N
ORDER BY X COLLATE Latin1_General_BIN

代码目前以区分大小写的方式排序,但也可以调整为不区分大小写的排序,例如通过使用

ORDER BY UPPER(X) COLLATE Latin1_General_BIN

ORDER BY LOWER(X) COLLATE Latin1_General_BIN

【讨论】:

    【解决方案2】:

    你试过了吗?

    SELECT column_x
    FROM table_name x
    ORDER BY x.column_name ASC|DESC, x.column_name ASC|DESC;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-27
      • 2010-09-09
      • 1970-01-01
      • 2018-07-22
      • 2014-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多