Разница между ORDER BY (VARCHAR) и ORDER BY TO_NUMBER (VARCHAR) - PullRequest
0 голосов
/ 01 октября 2018

В следующем наборе из двух запросов он будет работать как один и тот же набор значений, где в одном случае float, а в другом случае сравнивается строка float с фиксированным размером значений

SELECT * FROM SAMPLE_TABLE WHERE MAIN_ID = 'SomeVal' ORDER BY OBJ_ID ASC

В приведенном выше SQL, MAIN_ID используется для фильтрации связанных строк, а OBJ_ID является первичным ключом SAMPLE_TABLE , где OBJ_ID - строка чисел с плавающей запятой с фиксированным размером в формате 999999.9999, но когда я пытался TO_NUMBER (OBJ_ID) вместо OBJ_ID показывает невозможность конвертации.Таким образом, я сохранил то же, что и выше, и запустил и получил результаты сортировки, такие же, как и при использовании float.

Мой вопрос:

  1. ORDER BY OBJ_ID и ORDER BY TO_NUMBER(OBJ_ID) приведет к другому порядку результатов?

  2. Если так, есть ли какое-либо иное решение, кроме TO_NUMBER , которое может обслуживать строку в правильном формате, например999999,9999 и не совпадают с тем же запросом?

    Например, строка OBJ_ID имеет следующие значения 181001.2122, 181001.2123, 181001.2143, abcd, abc.efg, где последние два значения являются случайными значениями, представляющими отклоненную запись,есть какие-либо способы написать один sql, который будет правильно упорядочивать первые три числа с плавающей точкой, которые на самом деле являются строками с форматом "999999.9999"

Ответы [ 3 ]

0 голосов
/ 01 октября 2018

Сортировка строк является более сложной, и база данных может использовать различные подходы для этого.https://docs.oracle.com/cd/B19306_01/server.102/b14225/ch5lingsort.htm

with src as (
select '1' x from dual
union 
select '2' from dual
union
select '10' from dual)
select x from src order by x;


with src as (
select '1' x from dual
union 
select '2' from dual
union
select '10' from dual)
select x from src order by to_number(x);

Решение с lpad

with src as (
select '1' x from dual
union 
select '2' from dual
union
select '10' from dual)
select x from src order by lpad(x,10,'0');
0 голосов
/ 01 октября 2018

Как ответил Кристьян Кица, с varchar вы сортируете с varchar вы получаете алфавитный порядок.И если вы сортируете по номеру, вы получите числовой порядок.

0 голосов
/ 01 октября 2018

Сортировка (сравнение) строк / varchar отличается от сортировки (сравнения) чисел.

В числах 2<11, в строках / varchar "2">"11"

Предполагается, что выСортировка ASC, если вы не конвертируете в числа, у вас будет строка с «2» после строки с id = «11», и наоборот, если вы конвертируете в числа

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