Как я могу сортировать по столбцу таблицы в разных случаях (Oracle)

Как я могу сортировать таблицу со столбцом varchar2 с символами в разных случаях (верхний и ниже)?

например, когда я делаю заказ по столбцу Name, я получаю следующие результаты:

ANNIE
BOB
Daniel
annie
bob

что я хочу, это что-то вроде этого:

ANNIE
annie
BOB
bob
Daniel

5 ответов


использовать lower(field), например,

select * from tbl order by lower(name)

Если вам нужно обратиться к специальным символам для неанглийских языков, то другие ответы о NLSSORT могут быть тем, что вам нужно. Если вы этого не сделаете, я попытаюсь поцеловать и использовать lower() по мере того как очень легко вспомнить и использовать и быть прочитанным другими (ремонтопригодностью).


другой вариант-использование NLSSORT для выполнения лингвистическая сортировка:

SQL> with test as (select 'ANNIE' as col from dual
  2      union all select 'BOB' from dual
  3      union all select 'Daniel' from dual
  4      union all select 'annie' from dual
  5      union all select 'bob' from dual
  6      union all select 'Ångström' from dual
  7      union all select 'ångström' from dual)
  8  select col
  9  from test
 10  order by nlssort(col, 'NLS_SORT = WEST_EUROPEAN')
 11  /

COL
----------
Ångström
ångström
ANNIE
annie
BOB
bob
Daniel

преимущества больше гибкости. Можно сортировать символы с акцентами, а также различные случаи вместе. Можно выбрать, чтобы обработать некоторые символы на языке определенным образом указание различных значений для NLS_SORT. Определяет порядок в наборе эквивалентных символов. Таким образом, " A " и " a " сортируются вместе, но внутри - "а", верхний регистр на первом месте. Недостатки я ожидаю, что NLSSORT использует больше CPU, чем ниже, хотя я не отмечал его. И NLSSORT будет использовать только префикс больше строк:

возвращаемая строка, также известная как ключ сортировки, содержит необработанные данные тип. Длина ключа сортировки, полученного из заданного символа значение для данной сортировки может превышать 2000 байт, что максимальная длина необработанного значения, возвращаемого NLSSORT. В этом случай, NLSSORT вычисляет ключ сортировки для максимального префикса или начального подстрока, char так, чтобы вычисляемый результат не превышал 2000 байты. Для одноязычных сортировок, например французского языка, префикс длина обычно составляет 1000 символов. Для многоязычных сортировок, для пример GENERIC_M, префикс обычно составляет 500 символов. Точное длина может быть ниже или выше в зависимости от сортировки и символы, содержащиеся в Чаре.


Если вы находитесь в относительно последних версиях Oracle, вы должны посмотреть на настройку NLS_SORT / NLS_COMP, а не использовать функцию LOWER ().

Если вы не хотите глобально влиять на экземпляр, вы можете использовать функцию NLSSORT (), чтобы установить NLS_SORT для области определенного запроса.

SQL> create table case_insensitive(a varchar2(10));

Table created.

SQL> insert into case_insensitive values('D');

1 row created.

SQL> 
SQL> 
SQL> c/'D/'c
  1* insert into case_insensitive values('c')
SQL> /

1 row created.

SQL> c/'c/'B
  1* insert into case_insensitive values('B')
SQL> /

1 row created.

SQL> c/'B/'a
  1* insert into case_insensitive values('a')
SQL> /

1 row created.

SQL> commit;

Commit complete.

SQL> select * from case_insensitive;

A
----------
D
c
B
a

SQL> select * from case_insensitive order by a;

A
----------
B
D
a
c

SQL> select * from case_insensitive order by nlssort(a,'NLS_SORT=BINARY_CI'); 

A
----------
a
B
c
D

хороший пример этого можно найти здесь.


можно использовать INITCAP например

SELECT fld FROM tbl ORDER BY INITCAP(fld) ASC;

вы можете использовать заказ по cluse для этого

select col_name from table_name 
order by col_name ;