проблема сортировки с именем (тип данных varchar2) в oracle sql - PullRequest
0 голосов
/ 15 мая 2018

У меня есть пользовательская таблица, в которой у меня есть имя столбца с типом данных varchar2.Когда я выполняю простой оператор выбора с предложением order by, как показано ниже:

select * from Loginuser order by firstname

Я получаю результат в правильном формате заказа.Имена начинаются с A и продолжаются в следующем порядке, но последние 3 записи не соответствуют этому критерию.

Если я проверю последние 6 записей с именем, как показано ниже:

Ying
Yogen
Yvet
alo
pal
Ângelo

Так что я не знаю, что не так с последними тремя записями?

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Тим Бигелейзен дал решение о том, как можно решить проблему.Но чтобы ответить на вопрос, который вы задали:

что не так с последними тремя записями?

ORDER BY в столбце CHAR / VARCHAR2 будет сортировать покод символа последовательных символов.

SQL Fiddle

Запрос 1 :

SELECT firstname,
       ASCII( firstname ),
       DUMP( firstname )
FROM   loginuser

Результаты :

| FIRSTNAME | ASCII(FIRSTNAME) |                          DUMP(FIRSTNAME) |
|-----------|------------------|------------------------------------------|
|      Ying |               89 | Typ=1 Len=4: 89,105,110,103              |
|     Yogen |               89 | Typ=1 Len=5: 89,111,103,101,110          |
|      Yvet |               89 | Typ=1 Len=4: 89,118,101,116              |
|       alo |               97 | Typ=1 Len=3: 97,108,111                  |
|       pal |              112 | Typ=1 Len=3: 112,97,108                  |
|    Ângelo |            50050 | Typ=1 Len=7: 195,130,110,103,101,108,111 |

Из столбца ASCII видно, что Y имеет код символа 89, a равен 97, p равен 112 и Â равен2-байтовый символ Unicode 50050 (или байты 195 и 130), и они отсортированы в порядке возрастания номеров кодов символов.

Другим решением является использование CONVERT и UPPER или LOWER:

Запрос 2 :

SELECT firstname,
       UPPER( CONVERT( firstname, 'US7ASCII' ) )
FROM   loginuser
ORDER BY UPPER( CONVERT( firstname, 'US7ASCII' ) )

Результаты :

| FIRSTNAME | UPPER(CONVERT(FIRSTNAME,'US7ASCII')) |
|-----------|--------------------------------------|
|       alo |                                  ALO |
|    Ângelo |                               ANGELO |
|       pal |                                  PAL |
|      Ying |                                 YING |
|     Yogen |                                YOGEN |
|      Yvet |                                 YVET |
0 голосов
/ 15 мая 2018

Вы можете попробовать использовать ORDER BY вместе с двоичным сопоставлением:

SELECT *
FROM Loginuser
ORDER BY NLSSORT(firstname, 'NLS_SORT=BINARY_AI')

Из документации Oracle :

BINARY_AI обозначает ударениенечувствительный и нечувствительный к бинарной сортировке.

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