0

目前我正在尝试从我的表中获取一个值列表并按字母数字顺序排列它们,以便它们从数字到字母出现。例如我有这个数据集

3
8
56
70
90
AK
CN
PP
PQ
W3
0.5
0.6
0.8
040
070
1.2
1.5
1.6
100
150
187
2.8
250
3.0
6.3
800
8mm

我希望它先打印 0.5,然后最后打印 W3。我正在使用 Lpad 来获取数据,但它显示如上所示,没有排序。有没有办法可以在 Oracle SQL 中按字母数字顺序对这些进行排序?

(SQL 语句)

SELECT * 
FROM data_table
ORDER BY LPAD(parameter_type, 10) ASC 
OFFSET 0 ROWS FETCH NEXT 1000 ROWS ONLY;
4

2 回答 2

0

MySQL

或许是这样的:

SELECT val,
       val REGEXP '^[a-zA-Z]',
       CAST(val AS DECIMAL(14,4))
FROM mytesting 
ORDER BY CASE WHEN val REGEXP '^[a-zA-Z]' >= 1 THEN 1 ELSE 0 END ASC,
         CAST(val AS DECIMAL(5,2)) ASC;

首先,我使用CASE表达式REGEXP来检查前导值是字母还是数字;如果值以字母开头,我分配给,1如果不是,我将分配给它,0所以它会在升序的顶部。然后我添加第二个订单,在其中我val使用 将数据类型更改为十进制CAST。我把这两个操作都放进SELECT去看看过滤后它返回的值是什么。由于它们的SELECT目的仅用于查看目的,因此您可以将它们从最终查询中删除,这样应该可以:

SELECT val
FROM mytesting 
ORDER BY CASE WHEN val REGEXP '^[a-zA-Z]' >= 1 THEN 1 ELSE 0 END ASC,
         CAST(val AS DECIMAL(5,2)) ASC;

或者,如果您发现这些值很有用并且想要使用它们,您可以将查询简化为如下所示:

SELECT val,
       CASE WHEN val REGEXP '^[a-zA-Z]' >= 1 THEN 1 ELSE 0 END AS val_check,
       CAST(val AS DECIMAL(14,4)) AS val_convert
FROM mytesting 
ORDER BY val_check ASC,
         val_convert ASC;

演示小提琴

好吧,您可能已经猜到了,上面的答案是针对 MySQL 的,并在标签更改之前发布。不幸的是,Oracle 不是我的日常数据库,但是本着不试图发布错误答案的精神,我这样做了:

SELECT val,
       CASE WHEN REGEXP_LIKE(val,'^[0-9]')
                   THEN CAST(REGEXP_REPLACE(val,'[a-zA-Z]','')+0 AS DEC(5,2)) 
              WHEN REGEXP_REPLACE(val,'[^a-zA-Z]','') IS NULL
                   THEN CAST(val AS DEC(5,2)) 
              ELSE 9000*9000 END AS val_check
       FROM mytesting 
ORDER BY CASE WHEN REGEXP_LIKE(val,'^[0-9]')
                   THEN CAST(REGEXP_REPLACE(val,'[a-zA-Z]','')+0 AS DEC(5,2)) 
              WHEN REGEXP_REPLACE(val,'[^a-zA-Z]','') IS NULL
                   THEN CAST(val AS DEC(5,2)) 
              ELSE 9000*9000 END,
              val;

试图模仿与上面 MySQL 建议的解决方案相同的想法。 演示小提琴

于 2021-12-16T01:24:26.137 回答
0

MySQL - 尝试转换为十进制并检查大于零的值 -

SELECT * 
FROM data_table
ORDER BY IF(
    CONVERT(parameter_type, DECIMAL(6, 2)) > 0,
    CONVERT(parameter_type, DECIMAL(6, 2)),
    99999
) ASC, parameter_type ASC;

Oracle - 如果您使用 Oracle,则需要使用 CASE,因为它没有 IF() 函数。此外,您不能使用 CAST,因为它不像 MySQL 那样宽容。

SELECT * 
FROM data_table
ORDER BY
  CASE WHEN REGEXP_INSTR(parameter_type, '^[0-9]') > 0 THEN TO_NUMBER(REGEXP_REPLACE(parameter_type, '[^0-9\.]', '')) END ASC, parameter_type ASC

这将检查第一个字符是否为 [0-9],如果是,则删除除 [0-9.] 之外的所有内容并将其转换为数字。db<>小提琴

于 2021-12-15T23:52:28.487 回答