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 建议的解决方案相同的想法。
演示小提琴