Символ амперсанда (&) игнорируется в Oracle ORDER BY - PullRequest
2 голосов
/ 16 апреля 2011

Я выполняю запрос в 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

Кажется, что '&' не рассматривается в предложении ORDER BY.Кто-нибудь знает, является ли это ожидаемым поведением или я пропускаю какой-то шаг настройки?Я понимаю, что для вставок или обновлений нужно экранировать от амперсанда.Но дело в том, что персонаж уже в таблице!

Заранее спасибо, ребята.

Ответы [ 2 ]

3 голосов
/ 16 апреля 2011

Это эффект лингвистической сортировки:

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.

1 голос
/ 16 апреля 2011

Это может зависеть от настроек NLS_LANGUAGE и NLS_SORT.

В Oracle 10g я получаю следующее: NLS_LANGUAGE = AMERICAN и NLS_SORT = (ноль).

TXT 
--- 
&   
N   
P   

TXT 
--- 
&Z  
N   
P   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...