5

私は Oracle 10g DB を持っていて、VARCHAR2 (2000 文字) 列を持っているので、前に数字を含むことができる TEST という名前を付けることができます。

test
1test
3test

「... order by TEST asc」または単に「... order by TEST」を呼び出すと、

次のように並べられた結果を取得します

test
1test
3test

しかし、結果を次のように並べ替えたいと思います。

1test
3test
test

番号付きの挿入が最初ですが、これを達成する方法はありますか?

4

4 に答える 4

5

NLS_SORTは何に設定されていますか? ( select sys_context('USERENV', 'NLS_SORT') from dual)。その場合BINARY、並べ替え順序は各文字の数値に基づくため、データベースの文字セットに依存します。それ以外の場合は、オーバーライドすることをお勧めします。

そのパラメーターを変更することにより、データベースまたはセッション レベルで並べ替え順序を変更できますが、単一のクエリに対しても変更できます。

order by nlssort(test,'NLS_SORT=BINARY')

文字セットによっては、 の代わりに別の値を試す必要がある場合がありますBINARY。ですべての有効な値のリストを取得できますselect value from v$nls_valid_values where parameter = 'SORT'。ただし、NLS_SORT のドキュメントに記載されている潜在的なパフォーマンスへの影響に注意してください。

nlssort()関数はここに文書化されています

于 2011-03-10T10:18:00.700 に答える
4

以前の回答の substr テストを正規表現に置き換えることができます

order by case when regexp_instr(test,'[0-9]+') = 1 then 
   to_number(regexp_substr(test,'[0-9]+')) 
else 
   null 
end nulls last, test

それはそのようなものでなければなりません-あなたが望むものに従って正規表現を微調整することができます.

于 2011-03-10T10:17:53.637 に答える
3

一方通行:

order by case when substr(test,1,1) between '0' and '9' then 1 else 2 end,
         test
于 2011-03-10T09:49:55.923 に答える