Подтвердить что ты не робот

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

Как сортировать таблицу с столбцом varchar2 с символами в разных случаях (ВЕРХНИЙ и ниже)?

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

ANNIE
BOB
Daniel
annie
bob

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

ANNIE
annie
BOB
bob
Daniel
4b9b3361

Ответ 1

Используйте lower(field), например.

select * from tbl order by lower(name)

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

select col_name from table_name 
order by col_name ;