Использование SQL Server, пытающегося выполнить ORDER BY, используя Casting SUBSTRING to INT

У меня есть строковый столбец в моей базе данных, и поля представляют собой смесь чисел и тире. Пример 24-2548-25 .

Я хотел бы сортировать по центральному набору чисел как целые числа из-за проблем с заполнением, таких как 24-25-25 и 24-1111-25 , не сортировать численно, а в алфавитном порядке.

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

 SELECT tblDrawings.* FROM tblDrawings WHERE (((tblDrawings.AreaNo) = "21")) ORDER BY SET @DashInt = PATINDEX('%-%', tblDrawings.DrawingNo); SET @SecondDashInt = CHARINDEX('-',tblDrawings.DrawingNo,@DashInt + 1) IF @DashInt > 0{CAST(SUBSTRING(tblDrawings.DrawingNo , IF @SecondDashInt > 0 {@DashInt + 1 ,@SecondDashInt} ELSE {LEN(tblDrawings.DrawingNo)} AS INT))} ELSE {DrawingNo}; 

При условии, что номер чертежа всегда состоит из трех частей и, предположив, что вы просто хотите сортировать по среднему компоненту по возрастанию, вы можете (ab) использовать функцию PARSENAME как указано здесь, чтобы ускорить разделение компонентов чисел (тире должны быть заменены точками, чтобы обмануть функцию, считая, что это полное имя):

 SELECT tblDrawings.* FROM tblDrawings WHERE (((tblDrawings.AreaNo) = "21")) ORDER BY CAST(PARSENAME(REPLACE(DrawingNo, '-', '.'), 2) AS BIGINT) ASC; 

Скриншот здесь

(Parsename работает только с 4 частями, а упорядочение – справа налево)

редактировать

Вероятно, вам придется проанализировать все данные и выработать точный порядок, необходимый до завершения вашего запроса. Некоторые идеи, FWIW:

  • parsename не будет работать, если у вас есть переменное количество компонентов – предположим, что вы смотрите на вытягивание компонента, разделяющего UDF, на ваш db, как этот
  • С точки зрения здравомыслия и DRY, вы, вероятно, не хотите делать все это за один шаг – CTE облегчит жизнь, когда вы передадите результат одного преобразования данных в следующий.
  • Вы можете попробовать простую технику, как показано ниже, чтобы попытаться задать смешанное числовое / нечисловое упорядочение. Чтобы учесть альфа-суффиксы, я предполагаю, что отступы должны быть как левыми, так и правыми от исходного значения, с правильным дополнением, зарезервированным для заполнения нечисловых суффиксов вправо
  • Вы можете выполнить условное упорядочение с помощью ORDER BY CASE WHEN ... THEN ... ELSE ... END , хотя обратите внимание, что все ветви должны возвращать один и тот же тип .

Пример идеи заполнения «цель»:

xxx1x
xx11x
x111x
x111A
x112x

 WITH cte as ( SELECT *, PARSENAME(REPLACE(DrawingNo, '-', '.'), 3) as [3FromRight], PARSENAME(REPLACE(DrawingNo, '-', '.'), 2) as [2FromRight], PARSENAME(REPLACE(DrawingNo, '-', '.'), 1) as [1FromRight] FROM tblDrawings ) SELECT * FROM cte ORDER BY REPLICATE('x',12-LEN([2FromRight])) + [2FromRight] + REPLICATE('x', 1) ASC; 

Количество реплицированных x в «12-» и «1» нужно будет скорректировать, чтобы подсчитать количество числовых и нечисловых символов, а затем отрегулировать отступ до и после. Поэтому использование другого запроса nesting / cte, вероятно, необходимо было бы подсчитать количество символов в разделенных компонентах.

  • Как объединить СМЕЩЕНИЕ / FETCH и WITH TIES?
  • Когда не указывается «Order by», какой порядок выбирает запрос для вашего набора записей?
  • Sql Server query varchar data sort вроде int
  • Ошибка «Недопустимое имя столбца» в запросе с порядковым выражением и внешним выбором
  • Как выбрать отдельные данные с требуемым ЗАКАЗОМ?
  • MSSQL Сортировать по дате с отдельными
  • Порядок SQL по регистру
  • Ошибка преобразования sql orderby при использовании
  • Алфавитно-цифровая сортировка в Sql Server 2008
  • Группа SQL Server по заказу
  • Динамическая сортировка SQL Server на нескольких столбцах INT
  • Давайте будем гением компьютера.