Skip to content Skip to sidebar Skip to footer

Oracle Sql | Modifying Data In Order By

following structure in a ORACLE table: FILE_NAME ----------- 12345_l.tif 12345_m.tif 12345_r.tif 12345_x.tif 12345_y.tif Need the following result: First *_m* Then *_l* Then *_r*

Solution 1:

Change your ORDER BY to order it by a numeric:

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

e.g.

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

Gives:

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

Hope it helps...

Alternatively you could use:

ORDERBY (CASE SUBSTR(file_name, INSTR(file_name, '_')+1, 1)
             WHEN'm'THEN1WHEN'l'THEN2WHEN'r'THEN3ELSE4END) ASC;

E.G.:

WITH t
  AS (SELECT'12345_l.tif'AS file_name FROM dual
      UNIONSELECT'12345_y.tif'FROM dual
      UNIONSELECT'12345_r.tif'FROM dual
      UNIONSELECT'12345_x.tif'FROM dual
      UNIONSELECT'12345_m.tif'FROM dual)
SELECT file_name
  FROM t
 ORDERBY (CASE SUBSTR(file_name, INSTR(file_name, '_')+1, 1)
             WHEN'm'THEN1WHEN'l'THEN2WHEN'r'THEN3ELSE4END) ASC;

Gives:

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

Post a Comment for "Oracle Sql | Modifying Data In Order By"