3

Oracleでクエリを実行していますが、そのクエリは、アンパサンド付きの値を持つ可能性のある列順に並べられています。ただし、アンパサンドは並べ替えアルゴリズムによって無視されているようです。

例えば:

select * from (
    select '&' txt from dual
    union
    select 'P' txt from dual
    union
    select 'N' txt from dual
)
order by txt

正確に(そして正しく、私は推測します)印刷します:

&
N
P

ただし、「&」を含むテキストを「&Z」に変更すると、結果は次のように変わります。

select * from (
    select '&'||'Z' txt from dual // concatenating just to
                                  // avoid variable substitution
    union
    select 'P' txt from dual
    union
    select 'N' txt from dual
)
order by txt

結果は次のとおりです。

N
P
&Z

'Z'を'A'に変更すると、結果は次のようになります。

&A
N
P

'&'はORDERBY句で考慮されていないようです。これが予期される動作であるかどうか、または構成手順が欠落しているかどうかを誰かが知っていますか?挿入または更新のためにアンパサンドをエスケープする必要があることを理解しています。しかし、事はキャラクターがすでにテーブルにいるということです!

よろしくお願いします。

4

2 に答える 2

4

これは、言語ソートの効果です。

SQL> alter session set nls_sort=binary;

Session altered.

SQL> get afiedt.buf
  1  select * from (
  2  select '&' txt from dual
  3  union
  4  select '&'||'Z' txt from dual
  5  union
  6  select '&'||'A' txt from dual
  7  union
  8  select 'P' txt from dual
  9  union
 10  select 'N' txt from dual
 11  )
 12* order by txt
SQL> /

TX
--
&
&A
&Z
N
P

SQL> alter session set nls_sort = 'Dutch';

Session altered.

SQL> get afiedt.buf
  1  select * from (
  2  select '&' txt from dual
  3  union
  4  select '&'||'Z' txt from dual
  5  union
  6  select '&'||'A' txt from dual
  7  union
  8  select 'P' txt from dual
  9  union
 10  select 'N' txt from dual
 11  )
 12* order by txt
SQL> /

TX
--
&
&A
N
P
&Z

並べ替える言語に違いはあります。一部の文字は、言語によって値が異なります。バイナリでは、ASCII値を使用してソートします。

于 2011-04-16T07:26:48.943 に答える
1

NLS_LANGUAGEおよびNLS_SORTの設定によって異なる場合があります。

Oracle 10gで、NLS_LANGUAGE=AMERICANおよびNLS_SORT=(null)で次のようになります。

TXT 
--- 
&   
N   
P   

TXT 
--- 
&Z  
N   
P   
于 2011-04-16T06:27:35.557 に答える