Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как правильно упорядочивать ? / 10 сообщений из 10, страница 1 из 1
27.06.2002, 13:59:48
    #32034127
Andrey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно упорядочивать ?
Как правильно упорядочивать ?

Пишу следующее
SELECT * FROM table ORDER BY number
и получаю
------------------------
14
14
2
2
23
23
23
23
34
34
43
5
53
54
54
55
76
76
------------------------
А как получить правильно (не по первому символу ?)
---
1
2
3
4
14
16
58
...
---


Заранее благодарен.

Андрей.
...
Рейтинг: 0 / 0
27.06.2002, 14:06:44
    #32034130
s_alexander
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно упорядочивать ?
У тебя сортировка получается как у строки. Это поле не CHAR случайно?
...
Рейтинг: 0 / 0
27.06.2002, 14:14:06
    #32034131
Andrey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно упорядочивать ?
именно CHAR - мне это важно, а что теперь делать ?
...
Рейтинг: 0 / 0
27.06.2002, 14:31:54
    #32034134
jimmers
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно упорядочивать ?
Код: plaintext
SELECT * FROM @t ORDER BY cast(number as int)


Только у Вас выборки разные - почему?
...
Рейтинг: 0 / 0
27.06.2002, 14:35:55
    #32034137
s_alexander
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно упорядочивать ?
Не знаю, может создать calculated поле с типом INTEGER, в которое писать значения из этого поля и сортировать по нему.
В Interbase это как-то решалось использованием collation (это такая хрень, которая задает порядок сортировки для различных языков, о моему :) ) ... детали не помню, может в MSSQL что-то подобное есть.
...
Рейтинг: 0 / 0
27.06.2002, 17:35:11
    #32034174
Andrey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно упорядочивать ?
К сожалению вариант с
SELECT * FROM @t ORDER BY cast(number as int)
не подходит так как в поле иногда встречается не только цифры, но и буквы (оно не просто так char) отсюда возникает ошибка (не может сделать это поле int)

А выборки разные просто так - для наглядности, я писал их от руки.

У Вас есть еще какие-нибудь соображения ?

Заранее спасибо.
...
Рейтинг: 0 / 0
27.06.2002, 17:46:30
    #32034176
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно упорядочивать ?
Пишите UDF-функцию, которая будет преобразовывать ваши значения в цифровой эквивалент. Вот пример простенькой:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create function CharToNumeric
 (@Value varchar( 10 ))
returns int
as
begin
  if IsNumeric(@Value)
    return convert(int, @Value)

  return NULL
end


Естественно, если у вас в поле одновременно могут хранится цифры и буквы, то пишите свой алгоритм распаковки значения поля.
...
Рейтинг: 0 / 0
27.06.2002, 17:58:00
    #32034178
jimmers
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно упорядочивать ?
У Вас есть еще какие-нибудь соображения ?

Соображения есть. Надо приводить полные исходные данные, уважаемый.

Вот Вы говорите: как в поле иногда встречается не только цифры, но и буквы

Какие буквы? A, B, C, D, E, F (то, что можно в HEX преобразовать) или нет? Если 'нет', то мы должны угадать алгоритм сравнения 'буквенных' и 'цифровых' значений?

Удачи
...
Рейтинг: 0 / 0
27.06.2002, 21:26:33
    #32034204
Andrey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно упорядочивать ?
С замечаниями согдасен. Сори за невнфтность.
Итак: могу добавить пожалуй одно. Физический смысл этого поля в моей таблице - это номер дома. А следовательно он может быть и 1a и 1/1 а сортировка типа
1
12
2
25
29
....
заказщика не устраивает.
Что делать ?

Спасибо за содействие.
Андрей.
...
Рейтинг: 0 / 0
28.06.2002, 07:02:17
    #32034224
Dominic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно упорядочивать ?
Могу предложить такое (использую в своих приложениях):
дополняй номера домов в запросе '0' до размерности поля, типа:

CREATE TABLE #t (c CHAR(4))
INSERT INTO #t VALUES ('1')
INSERT INTO #t VALUES ('12')
INSERT INTO #t VALUES ('2')
INSERT INTO #t VALUES ('21')
INSERT INTO #t VALUES ('3')
INSERT INTO #t VALUES ('31')
SELECT * FROM #t ORDER BY c
SELECT c FROM #t ORDER BY RIGHT(('0000' + RTRIM(c)),4)
DROP TABLE #t

Приведенный "хитрый" ORDER BY работает только со значениями, содержащими исключительно цифры. Как быть с символами-"не-цифрами" в номерах домов? Нужно формализовать бизнес-логику сортировки таких номеров. Например, просто их не учитывать при сортировке:

CREATE TABLE #t (c CHAR(4))
INSERT INTO #t VALUES ('1')
INSERT INTO #t VALUES ('1a')
INSERT INTO #t VALUES ('2/2')
INSERT INTO #t VALUES ('21')
INSERT INTO #t VALUES ('3')
INSERT INTO #t VALUES ('31')
SELECT * FROM #t ORDER BY c
SELECT c FROM #t
ORDER BY RIGHT('0000' + LEFT(c,PATINDEX('%[А-Я,а-я,/,-,A-Z,a-z]%', RTRIM(c)+'/')-1),4)
DROP TABLE #t

Как-то я выступал в форуме по поводу "наглядности кода для потомков"... Абсолютно согласен с ASCRUS`ом, в смысле, что правила сортировки лучше всего инкапсулировать в UDF-функцию. Спасибо M$, что такая возможность появилась в 2000: со времен моего перехода с MS ACCESS на SQL 6.5 мне сильно не хватало возможности расширенной обработки данных непосредственно в бланке запроса. Итак, с UDF-функцией:

CREATE FUNCTION SortRulesForHoumNumber (@houm CHAR(4))
RETURNS CHAR(4)
BEGIN
DECLARE @start_location INT, @houm_var VARCHAR(8)
SET @houm_var = CONVERT(VARCHAR(8), @houm)
SET @houm_var = RTRIM(@houm_var)+'/'
SET @start_location = PATINDEX('%[А-Я,а-я,/,-,A-Z,a-z]%', @houm_var)
SET @houm_var = LEFT(@houm_var, @start_location - 1)
SET @houm_var = RIGHT('0000' + @houm_var,4)
RETURN CONVERT(CHAR(4), @houm_var)
END

GO

CREATE TABLE #t (c CHAR(4))
INSERT INTO #t VALUES ('1')
INSERT INTO #t VALUES ('1a')
INSERT INTO #t VALUES ('2/2')
INSERT INTO #t VALUES ('21')
INSERT INTO #t VALUES ('3')
INSERT INTO #t VALUES ('31')
SELECT * FROM #t ORDER BY c
SELECT c , dbo.SortRulesForHoumNumber(c) FROM #t
ORDER BY dbo.SortRulesForHoumNumber(c)

DROP TABLE #t

GO

DROP FUNCTION SortRulesForHoumNumber

GO

Что в последнем примере хорошего, кроме "массы"? Поскольку правила сортировки выделены в отдельную функцию, их можно централизовано модифицировать, причем без изменения текста запросов, использующих эту функцию (а запросы, например, еще и "зашиты" в коде программы-клиента). Например, в случае с номерами домов, появляется требование расширить сортировку внутри "дробей" ('4/1', '4/2', '4/2а') - спокойненько реализуешь. Ну а потомкам можно оставить в теле функции пространный комментарий, наподобие этого постинга.

С уважением, Dominic
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как правильно упорядочивать ? / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]