Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Сортировка поля varchar по "цифрам"  [new]
inSAne_GHoST
Member

Откуда:
Сообщений: 37
Извиняюсь если есть подобная тема, - не нашел.

Вообщем суть такова: имеется поле типа varchar (номер квартиры). В результатах выборки нужно чтобы сортировка проходила и по этому полю. В результате сортировки данные отображаются криво:

примерно так:
1 
10
11
2
220
3

и т.д.

Как можно добиться корректной сортировки данных если учитывать, что поле может содержать и знаки \ / - и строковые значения типа "уч", "к", "а", "б" и т.п.?
4 дек 09, 06:40    [8017425]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка поля varchar по "цифрам"  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31161
inSAne_GHoST
Как можно добиться корректной сортировки данных если учитывать, что поле может содержать и знаки \ / - и строковые значения типа "уч", "к", "а", "б" и т.п.?
Добить при сортировке слева какими-либо символами (например, нулями для наглядности) до одинаковой длинны строки.
4 дек 09, 08:57    [8017691]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка поля varchar по "цифрам"  [new]
aleks2
Guest
inSAne_GHoST,

Правильное решение - разделить номер дома на: 1) номер 2) усе прочее.
4 дек 09, 09:15    [8017773]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка поля varchar по "цифрам"  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
aleks2
inSAne_GHoST,

Правильное решение - разделить номер дома на: 1) номер 2) усе прочее.
+1000
Причём, можно просто определить вычисляемые поля для этого.
4 дек 09, 09:17    [8017787]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка поля varchar по "цифрам"  [new]
inSAne_GHoST
Member

Откуда:
Сообщений: 37
aleks2, спасибо за идею!

iap
+1000
Причём, можно просто определить вычисляемые поля для этого.


Немного не понял.

Можете пояснить, в каком смысле "определить вычисляемые поля"
4 дек 09, 10:10    [8018140]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка поля varchar по "цифрам"  [new]
--__Александр__--
Member

Откуда:
Сообщений: 2631
У вас есть строка ХХХХХХ
Разбивате ее на лексемы Х,ХХ,ХХХ,ХХХХ,ХХХХХХ,ХХХХХХХ
Далее, к каждой лексеме применяте isnumeric.
Лексема, с максимальным количеством символов и isnumeric = 1 - ваше поля для упорядочивания.
4 дек 09, 10:15    [8018164]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка поля varchar по "цифрам"  [new]
inSAne_GHoST
Member

Откуда:
Сообщений: 37
--__Александр__--
У вас есть строка ХХХХХХ
Разбивате ее на лексемы Х,ХХ,ХХХ,ХХХХ,ХХХХХХ,ХХХХХХХ
Далее, к каждой лексеме применяте isnumeric.
Лексема, с максимальным количеством символов и isnumeric = 1 - ваше поля для упорядочивания.


Спасибо за ответ.

Извиняюсь конечно, но немного не понял. Для тех, кто в танке, можно небольшой примерчик?
Заранее спасибо!
4 дек 09, 10:21    [8018202]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка поля varchar по "цифрам"  [new]
--__Александр__--
Member

Откуда:
Сообщений: 2631
Строка 12345ФЫВ
Получаете из нее
строки вида
1
12
123
1234
12345
12345Ф
12345ФЫ
12345ФЫВ

К каждой строке применяте isnumeric.
Берете ту сроку, у которой isnumeric = 1 и Len = MAX(Len)

Можно попробовать проще.Если у вас идут сначала только цифры, а потом только буквы,
то проще найти максимальную позицию с цифрой и сабстринг дальше.
4 дек 09, 10:32    [8018285]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка поля varchar по "цифрам"  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
USE tempdb;
SET NOCOUNT ON;
IF OBJECT_ID(N'T','U') IS NOT NULL DROP TABLE T;
CREATE TABLE T([номер квартиры] VARCHAR(100));
INSERT T([номер квартиры]) VALUES
 ('1 ')
,('10')
,('11')
,('2')
,('2/Б')
,('20')
,('3');
GO
SELECT *
FROM T
ORDER BY RIGHT(REPLICATE('0', COL_LENGTH(N'T',N'номер квартиры'))+SUBSTRING([номер квартиры], PATINDEX('%[^0-9][0-9]%','.'+[номер квартиры]), PATINDEX('%[0-9][^0-9]%',[номер квартиры]+'.')-PATINDEX('%[^0-9][0-9]%','.'+[номер квартиры])+1), COL_LENGTH(N'T',N'номер квартиры'));
4 дек 09, 10:36    [8018319]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка поля varchar по "цифрам"  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
--__Александр__--
Строка 12345ФЫВ
Получаете из нее
строки вида
1
12
123
1234
12345
12345Ф
12345ФЫ
12345ФЫВ

К каждой строке применяте isnumeric.
Берете ту сроку, у которой isnumeric = 1 и Len = MAX(Len)

Можно попробовать проще.Если у вас идут сначала только цифры, а потом только буквы,
то проще найти максимальную позицию с цифрой и сабстринг дальше.
Вы напрасно упираете на ISNUMERIC.
Эта функция вовсе не гарантирует наличие только цифр в строке.
4 дек 09, 10:40    [8018358]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка поля varchar по "цифрам"  [new]
--__Александр__--
Member

Откуда:
Сообщений: 2631
На сколько я помню, там только помимо цифр могут быть +,- и знаки валют.
Да, вы правы. Тогда с ISNUMERIC не совсем чисто.
4 дек 09, 10:45    [8018401]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка поля varchar по "цифрам"  [new]
inSAne_GHoST
Member

Откуда:
Сообщений: 37
Не успел в пятницу сказать спасибо.

Вообщем, --__Александр__-- и особенно iap огромное спасибо за помощь. Сортировка работает на отлично!

зы... и небольшая проблемка: как быть, если в запросе используются юнион? выдает ошибку:

"ORDER BY items must appear in the select list if the statement contains a UNION, INTERSECT or EXCEPT operator"
7 дек 09, 05:55    [8026219]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка поля varchar по "цифрам"  [new]
inSAne_GHoST
Member

Откуда:
Сообщений: 37
Конечно есть вариант разделить запрос на 2, и результаты скидывать в темповую таблицу. Но насколько я понял, сортировка в одном запросе с юнионом не получится?
7 дек 09, 05:59    [8026221]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка поля varchar по "цифрам"  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31161
inSAne_GHoST
зы... и небольшая проблемка: как быть, если в запросе используются юнион? выдает ошибку:

"ORDER BY items must appear in the select list if the statement contains a UNION, INTERSECT or EXCEPT operator"
Сообщение перевели? Сортировать можно по колонке, которая есть в списке колонок select-а
7 дек 09, 10:37    [8026804]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка поля varchar по "цифрам"  [new]
inSAne_GHoST
Member

Откуда:
Сообщений: 37
ну да, поле со списком квартир есть в списке селекта
7 дек 09, 11:00    [8026973]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка поля varchar по "цифрам"  [new]
inSAne_GHoST
Member

Откуда:
Сообщений: 37
выглядит примерно так:

select
<номер квартиры и т.д. остальные поля>
from
<таблица1>
union all
select
<номер квартиры и т.д. остальные поля>
from
<таблица2>

order by
<и сортировка, указанная выше>
7 дек 09, 11:18    [8027126]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка поля varchar по "цифрам"  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
inSAne_GHoST
выглядит примерно так:

select
<номер квартиры и т.д. остальные поля>
from
<таблица1>
union all
select
<номер квартиры и т.д. остальные поля>
from
<таблица2>

order by
<и сортировка, указанная выше>
Сервер же намекает: "Хочу в SELECTе поле <и сортировка, указанная выше>!"
7 дек 09, 11:26    [8027223]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить