0

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マット

4

1 に答える 1

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
于 2012-04-27T12:15:56.817 に答える