0

この質問はさまざまな形で行われていることは知っていますが、私の要件は少し異なります。

次のようなデータを含むテーブルがあるとします。

ID  NAME        VALUE

-----------------------------

1   ABC-2-2     X
2   PQRS-1-3    Y
3   ABC-3-2     Z
4   PQRS-1-4    A
5   PQRS-3-4    B
6   MNO-2-1     C
7   AAA-1       D
8   BBB-2       E
9   CCC-3       F

さて、私が期待している出力は次のようになります。

ID  NAME        VALUE

-----------------------------
7   AAA-1       D
2   PQRS-1-3    Y
4   PQRS-1-4    A
8   BBB-2       E
6   MNO-2-1     C
1   ABC-2-2     X
9   CCC-3       F
3   ABC-3-2     Z
5   PQRS-3-4    B

これは直接の英数字のソートではないことに注意してください。代わりに、最初の「-」の前の値は無視され、フィールドは名前の最初の「-」の後の値でソートされます。

私はPL/SQLにあまり精通していないので、これに関するあらゆる種類のヘルプをいただければ幸いです。

ありがとう。

PS:これはOracleとMySQLの両方で機能するはずであることに注意してください。

4

3 に答える 3

2

あなたの例では、これで十分です(Oracle構文):

ORDER BY SUBSTR(name,4)

最初のハイフンの前の文字数が変化する可能性がある場合は、これを行うことができます(これもOracle構文です)。

ORDER BY SUBSTR(name,INSTR(name,'-')+1)

ただし、次のようなコードがある場合は機能しません。

AAA-10-1
AAA-8-1
AAA-9-1

AAA-10-1の後に表示されることを期待しますAAA-9-1。次に、それをさらに解析する必要があります。

ORDER BY LPAD(SUBSTR(name,INSTR(name,'-')+1, INSTR(name,'-',1,2)-INSTR(name,'-')-1),10,'0'),
         LPAD(SUBSTR(name,INSTR(name,'-',1,2)+1),10,'0')

(注:データに数値以外の数値が含まれていると失敗する可能性があるため、TO_NUMBERを使用するのではなく、LPAD(x、10、 '0')を使用して'1'などの値を'0000000001'などに変換しました。 )。

例:

with data as
(
select 'AAA-1' name from dual
union all
select 'PQR-1-4' name from dual
union all
select 'PQR-1-3' name from dual
union all
select 'AAA-10-10' name from dual
union all
select 'AAA-10-1' name from dual
union all
select 'AAA-9-10' name from dual
union all
select 'AAA-9-1' name from dual
)
select *
from data
ORDER BY LPAD(SUBSTR(name,INSTR(name,'-')+1, INSTR(name,'-',1,2)-INSTR(name,'-')-1),10,'0'),
         LPAD(SUBSTR(name,INSTR(name,'-',1,2)+1),10,'0');

出力:

NAME
---------
PQR-1-3
PQR-1-4
AAA-9-1
AAA-9-10
AAA-10-1
AAA-10-10
AAA-1

そして、AAA-1が最初に来る必要がある場合:

ORDER BY LPAD(SUBSTR(name,INSTR(name,'-')+1, INSTR(name||'-','-',1,2)-INSTR(name,'-')-1),10,'0'),
         LPAD(SUBSTR(name,INSTR(name||'-','-',1,2)+1),10,'0') nulls first
于 2013-01-16T16:38:52.160 に答える
0

mysqlの構文についてはよくわかりませんが、Oracleでこれを行うことができます。

select * from  <your_table>
order by substr(name, 5)
于 2013-01-16T16:45:26.590 に答える
0

mssqlでは、問題を見つけるための構文は次のとおりです。

select * from mytable order by substring(name,PATINDEX('%-%',name)+1,len(name)-PATINDEX('%-%',name))

SqlFiddle

于 2013-01-16T17:21:20.303 に答える