2012-04-27 27 views
0

結構如下:ORACLE SQL |爲了在Oracle表修改數據BY

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馬特

+0

是文件名真的那麼相似? (如那些數字沒有變化),如果是這樣,你可以使用SUBSTR和case case – Randy 2012-04-27 12:10:03

+0

結果中的數字總是相似的。我用'WHERE'條件過濾這個。 – frgtv10 2012-04-27 12:14:33

回答

2

更改ORDER BY通過一個數字來訂購吧:

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

例如

WITH t 
    AS (SELECT '12345_l.tif' AS file_name FROM dual 
     UNION 
     SELECT '12345_m.tif' FROM dual 
     UNION 
     SELECT '12345_r.tif' FROM dual 
     UNION 
     SELECT '12345_x.tif' FROM dual 
     UNION 
     SELECT '12345_y.tif' FROM dual) 
SELECT file_name 
    FROM t 
ORDER BY regexp_replace(FILE_NAME, '_m', 1), 
      regexp_replace(FILE_NAME, '_l', 2), 
      regexp_replace(FILE_NAME, '_r', 3); 

給出:

============== 
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; 

例如爲:

WITH t 
    AS (SELECT '12345_l.tif' AS file_name FROM dual 
     UNION 
     SELECT '12345_y.tif' FROM dual 
     UNION 
     SELECT '12345_r.tif' FROM dual 
     UNION 
     SELECT '12345_x.tif' FROM dual 
     UNION 
     SELECT '12345_m.tif' FROM dual) 
SELECT file_name 
    FROM t 
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 
+0

這是我的解決方案: 'ORDER BY REGEXP_REPLACE(REGEXP_REPLACE(REGEXP_REPLACE(FILE_NAME, '_r',3), '_l',2), '_ M',1)ASC;' – frgtv10 2012-04-27 12:24:08

+0

你用'CASE'第二溶液要好得多,特別是對於擴展。非常感謝你。 – frgtv10 2012-04-27 12:29:26

+0

不客氣,很高興我能幫上忙。 – Ollie 2012-04-27 12:31:56