Как отсортировать строку на основе чисел? - PullRequest
0 голосов
/ 24 октября 2018

Я работаю над SQL-запросом, в котором я хочу отсортировать строку на основе чисел.

У меня есть одна таблица столбца ( Имя столбца - Имя ), в которой есть несколько полей.При использовании ORDER BY NAME он печатается следующим образом:

hello_world
hello_world10
hello_world11
hello_world12
hello_world13
hello_world14
hello_world15
hello_world4
hello_world5

Для вышеприведенного запроса я использовал ORDER BY NAME; , но, похоже, он не печатается наОснова чисел.

Постановка проблемы:

Мне интересно, какой SQL-запрос мне нужно написать или какие изменения нужно внести в мой SQL-запрос выше, чтобы он печатал все наОснова чисел, о / п должен быть таким:

hello_world
hello_world4
hello_world5
hello_world10
hello_world11
hello_world12
hello_world13
hello_world14
hello_world15

Ответы [ 5 ]

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

Я думаю, что самое простое решение для этого конкретного случая (где все значения имеют одинаковый префикс):

order by length(name), name
0 голосов
/ 24 октября 2018

мы можем заказать его, используя методы замены и приведения.Я попытался следующий запрос

select Name, cast(REPLACE(Name, 'hello_world', '') as UNSIGNED ) as repl from Users order by repl;

Для генерации данных выборки

CREATE TABLE Users (
    Name varchar(255) NOT NULL
);

insert into Users(Name) values
('hello_world'),
('hello_world4'),
('hello_world5'),
('hello_world10'),
('hello_world11'),
('hello_world12'),
('hello_world13'),
('hello_world14'),
('hello_world15')
;

EDIT запрос без замененного столбца,

    select City from Persons order by cast(REPLACE(City, 'hello_world', '') as UNSIGNED );
0 голосов
/ 24 октября 2018

Хотя вопрос про mysql.

Я пробовал на сервере sql .

create table #t1 (id varchar(100));

insert into #t1 (id) values ('Pq1'),('pq3'),('pq2')

select * from #t 
order by 
CAST(SUBSTRING(id + '0', PATINDEX('%[0-9]%', id + '0'), LEN(id + '0')) AS INT)
0 голосов
/ 24 октября 2018

Попробуйте это:

SELECT   name,
         CASE WHEN REGEXP_INSTR(name, '[0-9]') = 0 THEN 0
              ELSE CAST(SUBSTR(name, REGEXP_INSTR(name, '[0-9]')) AS INT)
         END AS progressive
FROM     my_table
ORDER BY progressive;
0 голосов
/ 24 октября 2018

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

в настоящее время у вас есть строки.

если шаблон верный, тогда вы можете использовать комбинациюманипуляции со строками, чтобы обрезать первые символы, которые должны оставлять только цифры, а затем использовать TO_NUMBER () для преобразования в порядке

что-то вроде

select name 
from mytable
order by to_number( replace( name, 'hello_world','' ))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...