ORACLE SQL |按顺序修改数据

ORACLE SQL |按顺序修改数据,oracle,oracle10g,sql-order-by,Oracle,Oracle10g,Sql Order By,ORACLE表中的以下结构: FILE_NAME ----------- 12345_l.tif 12345_m.tif 12345_r.tif 12345_x.tif 12345_y.tif 需要以下结果: First *_m* Then *_l* Then *_r* Then * (everything else) 正在尝试: SELECT FILE_NAME FROM TABLE WHERE FILE_NAME LIKE '12345%' ORDER BY regexp_replace

ORACLE表中的以下结构:

FILE_NAME
-----------
12345_l.tif
12345_m.tif
12345_r.tif
12345_x.tif
12345_y.tif
需要以下结果:

First *_m*
Then *_l*
Then *_r*
Then * (everything else)
正在尝试:

SELECT FILE_NAME FROM TABLE
WHERE FILE_NAME LIKE '12345%'
ORDER BY regexp_replace(FILE_NAME, '_m', '_1'),
         regexp_replace(FILE_NAME, '_l', '_2'),
         regexp_replace(FILE_NAME, '_r', '_3')
但这给了我一个错误的结果

有人给我一个提示吗


TIA Matt

更改您的订购方式以数字方式订购:

 ORDER BY regexp_replace(FILE_NAME, '_m', 1),
          regexp_replace(FILE_NAME, '_l', 2),
          regexp_replace(FILE_NAME, '_r', 3);
e、 g

给出:

==============
12345_m.tif
12345_l.tif
12345_r.tif
12345_x.tif
12345_y.tif
12345_m.tif
12345_l.tif
12345_r.tif
12345_x.tif
12345_y.tif
希望对你有帮助

或者,您可以使用:

 ORDER BY (CASE SUBSTR(file_name, INSTR(file_name, '_')+1, 1)
             WHEN 'm' THEN 1
             WHEN 'l' THEN 2
             WHEN 'r' THEN 3
             ELSE 4
            END) ASC;
例如:

给出:

==============
12345_m.tif
12345_l.tif
12345_r.tif
12345_x.tif
12345_y.tif
12345_m.tif
12345_l.tif
12345_r.tif
12345_x.tif
12345_y.tif

文件名真的那么相似吗?(就像那些数字没有变化)如果是这样,可以使用SUBSTR和case语句结果中的数字总是相似的。我用
WHERE
条件过滤它。这是我的解决方案:
orderbyregexp\u替换(regexp\u替换)(regexp\u替换(文件名,''u r',3),'u l',2),'u m',1)ASC
使用
CASE
的第二个解决方案要好得多,特别是对于扩展。非常感谢你。