SQL Sort / Cast последние пять символов вопрос - PullRequest
3 голосов
/ 07 июля 2010

У меня проблема с залипанием SQL, и я не лучше с SQL ...

У меня есть таблица со столбцом varchar (40), в котором есть данные в следующих двух форматах:

nn-nnn1nnn00000
nn-nnn-nnn-0000

Второй тип данных устарел;однако, поскольку они устарели, их нужно сначала просмотреть по порядку.Мне порекомендовали подстроковать последние 5 символов строки, затем привести их к числу, а затем, возможно, если значение -0000 превратится в отрицательное, то старшие будут сортироваться первыми.Я не уверен, что это сработает, хотя ...

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

nn-nnn-nnn-0001
nn-nnn-nnn-0002
nn-nnn-nnn-0003
nn-nnn1nnn00002 <-Should be 5th
nn-nnn2nnn00003 <-Should be 6th
nn-nnn3nnn00001 <-Should be 4th

Поскольку это для страницы asp .net, я думал о том, чтобы сделать что-то сумасшедшее с таблицами данных, но я знаю, что это было бы лучше для обработки SQLСервер.

Есть ли способ сортировки по последним пяти символам таким образом, чтобы более старые из них отображались первыми, при этом позволяя новым правильно сортировать следующие?

I на самом деле не хочу делать какие-то странные вещи в виде данных ...

Спасибо миллион !!!

Ответы [ 3 ]

4 голосов
/ 07 июля 2010

Я бы попробовал что-то вроде этого (хотя это можно считать неуклюжим):

Select
  Col, Case Left(Right(Col, 5), 1) When '-' Then 0 Else 1 End As Old
From
  Table
Order By
  Old, Col
3 голосов
/ 07 июля 2010

Правильные 5 символов & Cast as Integer работает отлично (после модификации !!)

Проверьте это ..

With MyTable AS
(
SELECT 'nn-nnn-nnn-0001' as MyData
UNION SELECT 'nn-nnn-nnn-0002'
UNION SELECT 'nn-nnn-nnn-0003'
UNION SELECT 'nn-nnn1nnn00002'
UNION SELECT 'nn-nnn2nnn00003'
UNION SELECT 'nn-nnn3nnn00001'
)
SELECT *
FROM MYTable
ORDER BY CASE WHEN SUBSTRING (MyData, 11, 1) = '-' THEN 0 ELSE 1 END, 
    CAST (REPLACE (RIGHT (MyData, 5), '-', 0) AS INTEGER)

MyData
---------------
nn-nnn-nnn-0001
nn-nnn-nnn-0002
nn-nnn-nnn-0003
nn-nnn3nnn00001
nn-nnn1nnn00002
nn-nnn2nnn00003

(6 row(s) affected)
1 голос
/ 07 июля 2010

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

Редактировать: Я только собирался прояснить это, но я не уверен, достаточно ли это странно для вас!

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