Сортировать текстовое поле - PullRequest
1 голос
/ 16 марта 2012

У меня есть следующие записи, и мне нужно отсортировать их соответственно:

AB*1
AB*2
AB*10
AB*100

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

SELECT      Column1 
FROM        dbo.Table1 
ORDER BY    LEN(Column1), Column1
WHERE Column1 Like 'AB*'

Когда я удаляю предложение Where в примере, запись AB * 100 появляется внизу. Очевидно, он сгруппировал все записи с длиной 4, затем начал все заново с записей длиной 5 и т. Д.

Можно ли заказать их так до того, как звездочка будет сгруппирована и правильно отсортирована?

Ответы [ 3 ]

2 голосов
/ 16 марта 2012

Первый символ «по алфавиту» на самом деле «без символа».Так что не так много, что «строка 4 на первом месте».Например, приведено следующее:

AB*1
AB*2
AB*10
AB*100 
CD*1
CD*2
CD*10
CD*100 

Вы можете упорядочить первые 3 символа в виде строки, а конечные символы - в виде числа.При условии, что ваши данные так себя ведут ...

ORDER BY
  LEFT(column1, 3),
  CLNG(MID(column1, 4, 8000))

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

AB*100 
AB*10Z
AB*1ZZ
AB*2ZZ

Использование этого вида оператора ORDER BY ...

ORDER BY
  column1 & string(8000 - LEN(column1), "z") 

Но это все обходные пути, чтобы вызвать «неестественный» порядок, поскольку в настоящее время вы получаете «правильный» порядок.

1 голос
/ 16 марта 2012

Вероятно, это будет медленно:

ORDER BY Mid(Column1,1,Instr(Column1,"*"))

Редактировать комментарий

SELECT Column1
FROM Table
ORDER BY Mid([Column1],1,InStr([Column1],"*")), 
         Val(Mid([Column1],InStr([Column1],"*")+1));

Пример данных, использованных в тесте:

ID
ab*1
ab*10
ab*2
abcdef*a1
abcdef*10
abcdef*40a

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

SELECT column1
FROM Table
ORDER BY Mid([column1] & "",1,InStr([column1] & "","*")),
         Val(Mid([column1] & "",InStr([column1] & "","*")+1));
1 голос
/ 16 марта 2012

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

SELECT      Column1 
FROM        dbo.Table1 
ORDER BY    left(Column1,2), LEN(Column1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...