在SQL中首先按字母排序,然后按数字排序

时间:2017-10-30 09:35:02

标签: sql sorting sql-order-by h2

在H2数据库中,当我通过varchar列应用订单时,数字首先出现在Alphabets中。但是需要首先使用Alphabets然后是Numbers。

我试过

ORDER BY IF(name RLIKE '^[a-z]', 1, 2), name

但是得到错误,如条件在H2中不可用。

我的列数据就像

A
1-A
3
M
2-B

5
B-2

它应该像

A
B-2
M
1-A
2-B
3
5

3 个答案:

答案 0 :(得分:0)

试试这个

SELECT MYCOLUMN FROM MYTABLE ORDER BY REGEXP_REPLACE (MYCOLUMN,'(*)(\d)(*)','}\2') , MYCOLUMN

答案 1 :(得分:0)

可以做的一件事是按顺序改变ASCII。

    WITH tab
     AS (SELECT 'A' col FROM DUAL
         UNION ALL
         SELECT '1-A' FROM DUAL
         UNION ALL
         SELECT '3' FROM DUAL
         UNION ALL
         SELECT 'M' FROM DUAL
         UNION ALL
         SELECT '2-B' FROM DUAL
         UNION ALL
         SELECT '5' FROM DUAL
         UNION ALL
         SELECT 'B-2' FROM DUAL)
  SELECT col
    FROM tab
ORDER BY CASE WHEN SUBSTR (col, 1, 1) < CHR (58) THEN CHR (177) || col ELSE col END;

我使用CHR(58)作为数字的ASCII值以57结尾。使用CHR(177),因为这是ASCII表中的最大值。

FYR:ASCII table

答案 2 :(得分:0)

鉴于示例数据集,我不确定您是否需要进一步的逻辑 - 所以我不会做出进一步的假设:

DECLARE @temp TABLE (myval char(3))
INSERT INTO @temp VALUES
('A'), ('1-A'), ('3'), ('M'), ('2-B'), ('5'), ('B-2')

SELECT myval
FROM @temp
ORDER BY CASE WHEN LEFT(myval, 1) LIKE '[a-Z]'
             THEN 1
             ELSE 2
       END
      ,LEFT(myval, 1)

提供输出:

myval
A  
B-2
M  
1-A
2-B
3  
5