Как можно сначала отсортировать таблицу по столбцу для числовых букв, а затем с учетом регистра для букв алфавита

Как можно отсортировать таблицу по столбцу varchar2 с символами в разных случаях: верхняя, нижняя, числовая строка

Например, когда я делаю заказ по столбцу NAME, данные столбца:

ANNIE
BOB
Daniel
annie
bob
1abc

Ожидаемый результат:

1abc    
ANNIE
annie
BOB
bob
Daniel

3 ответа

Решение

Это сложно. Обычный порядок сортировки: aa, aA, Aa, AA, ab, aB, Ab, AB, a1, A1, 1a, 1A. Таким образом, одни и те же имена сгруппированы, а затем строчные буквы идут первыми. Цифры идут после Z.

Это близко к тому, что вы после. Вы хотите, чтобы Бен пришел до БОБа, потому что вы заботитесь о том, чтобы БЕН был до БОБа в первую очередь и только потом о том, что О - капитал, а он - нет. Тем не менее, вы хотите, чтобы цифры стояли перед строчными и прописными перед строчными. Это имеет большое значение в конце концов.

Вы не можете сделать это легко, потому что, хотя вы хотите, чтобы слова (bob, BOB) были сгруппированы, как в порядке по умолчанию, вы хотите, чтобы отдельные символы обрабатывались по-разному. Вы можете сначала упорядочить по нижнему или верхнему порядку, чтобы получить группировку, но это поставит цифры в последнюю очередь, затем вы можете использовать двоичный порядок, чтобы получить A перед a.

order by lower(name), nlssort(name, 'NLS_SORT = BINARY');

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

order by my_own_sort_order(name);

РЕДАКТИРОВАТЬ (после принятия:-) Если подумать: вы хотите исходное поведение сортировки только с переключенным верхним / нижним регистром. Вы можете использовать переводчик для этого:

order by translate(name,
   'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', 
   'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');

Вы могли бы сделать что-то вроде:

SELECT *
FROM MyTable
ORDER BY UPPER(MyCol)

Пожалуйста, попробуйте это.

Select * from TableName 
Order by ColumnName Collate SQL_Latin1_General_CP850_BIN
Другие вопросы по тегам