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

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

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

ANNIE
BOB
Daniel
annie
bob

То, что я хочу, выглядит примерно так:

ANNIE
annie
BOB
bob
Daniel

Ответы [ 5 ]

36 голосов
/ 20 марта 2012

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

select * from tbl order by lower(name)

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

12 голосов
/ 20 марта 2012

Другим вариантом является использование функции 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» отсортированы вместе, но внутри «a» верхний регистр стоит первым. Недостатки Я ожидаю, что NLSSORT использует больше процессоров, чем LOWER, хотя я не отмечал это на стенде. И NLSSORT будет использовать только префикс длинных строк :

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

7 голосов
/ 20 марта 2012

Если вы пользуетесь сравнительно свежими версиями 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

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

0 голосов
/ 02 декабря 2015

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

SELECT fld FROM tbl ORDER BY INITCAP(fld) ASC;
0 голосов
/ 28 ноября 2015

Для этого вы можете использовать Орден cluse

select col_name from table_name 
order by col_name ;
...