Oracle сортировка строк, содержащих знак раздела § - PullRequest
2 голосов
/ 03 апреля 2020

У меня проблемы с получением правильного порядка сортировки для строк, в которых есть знак раздела (§).

У меня есть таблица в Oracle со столбцом, имеющим следующие значения Act §10 Act M Act §13(b)(2) Act § 6 Act Rule 10a- 2 Act § 7 Act § 4 Act S

Ожидаемая сортировка должна быть следующей: Act § 4 Act § 6 Act § 7 Act §10 Act §13(b)(2) Act M Act Rule 10a- 2 Act S

Двоичная сортировка по умолчанию помещает строки с § в конце. Я использовал функцию nlssort с параметром nls_sort = generic_m, но это дало мне следующее: Act §10 Act §13(b)(2) Act § 4 Act § 6 Act § 7 Act M Act Rule 10a- 2 Act S

Любая помощь приветствуется.

Ответы [ 2 ]

3 голосов
/ 03 апреля 2020

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

пример

alter table tab
add  col_order as (replace(col,'§ ','§0'));

Обратите внимание, что это только Чтобы преобразовать образец для обработки представленных данных, вам придется приложить немало усилий, чтобы получить правильную замену для вас полных данных.

Основная проблема, которую я вижу, заключается в заполнении всех частей столбца, которые должны интерпретироваться как числа и быть пустыми, с нулями.

Теперь сортировка запросов по новому столбцу col_order

select * from tab order by col_order;
COL             COL_ORDER                                    
--------------- ---------------------------------------------
Act § 4         Act §04                                      
Act § 6         Act §06                                      
Act § 7         Act §07                                      
Act §10         Act §10                                      
Act §13(b)(2)   Act §13(b)(2)                                
Act M           Act M                                        
Act Rule 10a- 2 Act Rule 10a- 2                              
Act S           Act S
1 голос
/ 03 апреля 2020

Вы можете просто удалить символ для целей сортировки:

WITH testData AS (
    select 'Act §10' as stringVal from dual union all
    select 'Act M' as stringVal from dual union all
    select 'Act §13(b)(2)' as stringVal from dual union all
    select 'Act § 6' as stringVal from dual union all
    select 'Act Rule 10a- 2' as stringVal from dual union all
    select 'Act § 7' as stringVal from dual union all
    select 'Act § 4' as stringVal from dual union all
    select 'Act S' as stringVal from dual
)

SELECT t.stringVal
FROM testData t
ORDER BY REPLACE(t.stringVal, '§', '')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...