Как ЗАКАЗАТЬ буквенно-цифровые значения в столбцах, специфичных для SQL - PullRequest
1 голос
/ 08 апреля 2019
create table Employee(id int, Registration_no varchar(50),Name varchar(50))

insert into @Employee values(1,'DLW/TTC/19/3','RAMESH')
insert into @Employee values(2,'DLW/TTC/19/2','RAJEEV')
insert into @Employee values(3,'DLW/TTC/19/1','RUPAK')
insert into @Employee values(4,'DLW/TTC/19/4','RAMLAAL')
insert into @Employee values(5,'DLW/TTC/19/8','RITESH')
insert into @Employee values(6,'DLW/TTC/19/6','HRITIK')
insert into @Employee values(7,'DLW/TTC/19/9','ROSHAN')
insert into @Employee values(8,'DLW/TTC/19/7','RUPALI')
insert into @Employee values(9,'DLW/TTC/19/5','SHRISTI')
insert into @Employee values(10,'DLW/TTC/19/10','ROSHNI')

select * from Employee

Здравствуйте, у меня есть таблица, приведенная выше. На самом деле сталкиваюсь с проблемой, в то время как я пытаюсь заказать столбец этой таблицы (Registration_no) Поэтому, пожалуйста, помогите мне ЗАКАЗАТЬ его в соответствии со столбцом (Registration_no)

Неважно, как устроены остальные столбцы. Я просто хочу, чтобы мой столбец Registration_no располагался в определенном порядке, как это

Registration_no
DLW/TTC/19/1
DLW/TTC/19/2
DLW/TTC/19/3
DLW/TTC/19/4
DLW/TTC/19/5
DLW/TTC/19/6
DLW/TTC/19/7
DLW/TTC/19/8
DLW/TTC/19/9
DLW/TTC/19/10

Ответы [ 7 ]

1 голос
/ 08 апреля 2019

Сортирует по цифрам справа от последнего / в строке Registration_No.Я только включаю SortColumn в набор результатов, чтобы вы могли видеть значения.Вы можете опустить его в своем запросе.

SELECT 
  e.*,
  CAST(RIGHT(e.Registration_no,CHARINDEX('/',REVERSE(e.Registration_no))-1) AS INTEGER) AS SortColumn
FROM @Employee AS e
ORDER BY
  CAST(RIGHT(e.Registration_no,CHARINDEX('/',REVERSE(e.Registration_no))-1) AS INTEGER)

Результаты:

+----+-----------------+---------+------------+
| id | Registration_no |  Name   | SortColumn |
+----+-----------------+---------+------------+
|  3 | DLW/TTC/19/1    | RUPAK   |          1 |
|  2 | DLW/TTC/19/2    | RAJEEV  |          2 |
|  1 | DLW/TTC/19/3    | RAMESH  |          3 |
|  4 | DLW/TTC/19/4    | RAMLAAL |          4 |
|  9 | DLW/TTC/19/5    | SHRISTI |          5 |
|  6 | DLW/TTC/19/6    | HRITIK  |          6 |
|  8 | DLW/TTC/19/7    | RUPALI  |          7 |
|  5 | DLW/TTC/19/8    | RITESH  |          8 |
|  7 | DLW/TTC/19/9    | ROSHAN  |          9 |
| 10 | DLW/TTC/19/10   | ROSHNI  |         10 |
+----+-----------------+---------+------------+

SortColumn сначала работает с REVERSE строкой, а затем с помощью CHARINDEX находит позицию изконец строки последнего вхождения /, затем возьмите это число -1 с правой стороны исходного столбца (-1, чтобы исключить сам /).

0 голосов
/ 08 апреля 2019

Как насчет этого?

select *
from Employee
order  by LEFT(Registration_no,PATINDEX('%[0-9]%',Registration_no)-1)-- alpha sort
, CONVERT(INT,REPLACE(SUBSTRING(Registration_no,PATINDEX('%[0-9]%',Registration_no),PATINDEX('%[0-9]%',Registration_no)),'/', '')) -- number sort
0 голосов
/ 08 апреля 2019

Хотя мне не нравится, как извлекается число, это то, как это можно сделать

select cast(substring(registration_no, charindex('/', registration_no, len(registration_no) -3) + 1, 3) as int), 
    * from Employee 
    order by 1

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

0 голосов
/ 08 апреля 2019

Вы можете использовать функцию reverse вместе с функцией charindex

SELECT e.*, cast( reverse(substring(reverse(Registration_no),1,
             charindex('/',reverse(Registration_no),1) -1 ) ) as int ) as nr
  FROM employee e
 ORDER BY nr;

Демо

Основным принципом является извлечение фрагментов и преобразование их в числовое значение, такое как целое число, в хвостовой части значений строки. С самого начала проще работать с функцией substring, если только функция reverse используется для обратного чтения строки. И в этом случае нам нужно определить положение первого разделителя (/) с помощью функции charindex. Все эти функции существуют с версии 2008 года.

0 голосов
/ 08 апреля 2019

Первое, что вы заметите при попытке упорядочить по Registration_no, это то, что он будет упорядочен в алфавитном порядке из-за характера строкового содержимого столбца типа varchar. Таким образом, правильный способ сделать это - преобразовать две последние части reg no в числа и использовать их по порядку. (в этом случае мы можем использовать только последнюю часть, так как 2-й последний всегда 19)

Выполняя небольшой поиск, я обнаружил, что эта функция 'Parsename' используется в сценариях репликации, поскольку она разбивает имя схемы объекта SQL на составляющие его части, поэтому мы можем использовать его здесь (до тех пор, пока не будет найдено ни одной части). не превышать 4 части "Максимальная часть объектов SQL")

Так что это будет работать в этом случае в SQL Server (T-SQL):

SELECT * 
FROM Employee 
order by cast(Parsename(replace(Registration_no,'/','.'),1) as int)

Подробнее здесь

Спасибо

0 голосов
/ 08 апреля 2019

Если шаблон в конце Registration_no всегда похож на /X или /XX, тогда:

select * from Employee
order by 
  case left(right(Registration_no, 2), 1) 
    when '/' then 
      left(Registration_no, len(Registration_no) - 1) + '0' + right(Registration_no, 1)
    else Registration_no
  end

См. Демоверсию .

0 голосов
/ 08 апреля 2019

Попробуйте этот запрос.

create table #Employee(id int, Registration_no varchar(50),Name varchar(50))

insert into #Employee values(1,'DLW/TTC/19/3','RAMESH')
insert into #Employee values(2,'DLW/TTC/19/2','RAJEEV')
insert into #Employee values(3,'DLW/TTC/19/1','RUPAK')
insert into #Employee values(4,'DLW/TTC/19/4','RAMLAAL')
insert into #Employee values(5,'DLW/TTC/19/8','RITESH')
insert into #Employee values(6,'DLW/TTC/19/6','HRITIK')
insert into #Employee values(7,'DLW/TTC/19/9','ROSHAN')
insert into #Employee values(8,'DLW/TTC/19/7','RUPALI')
insert into #Employee values(9,'DLW/TTC/19/5','SHRISTI')
insert into #Employee values(10,'DLW/TTC/19/10','ROSHNI')


select * from #Employee
order by Registration_no
id          Registration_no                                    Name
----------- -------------------------------------------------- --------------------------------------------------
3           DLW/TTC/19/1                                       RUPAK
10          DLW/TTC/19/10                                      ROSHNI
2           DLW/TTC/19/2                                       RAJEEV
1           DLW/TTC/19/3                                       RAMESH
4           DLW/TTC/19/4                                       RAMLAAL
9           DLW/TTC/19/5                                       SHRISTI
6           DLW/TTC/19/6                                       HRITIK
8           DLW/TTC/19/7                                       RUPALI
5           DLW/TTC/19/8                                       RITESH
7           DLW/TTC/19/9                                       ROSHAN
...