|
|
|
Как правильно упорядочивать ?
|
|||
|---|---|---|---|
|
#18+
Как правильно упорядочивать ? Пишу следующее 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 ... --- Заранее благодарен. Андрей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2002, 13:59:48 |
|
||
|
Как правильно упорядочивать ?
|
|||
|---|---|---|---|
|
#18+
У тебя сортировка получается как у строки. Это поле не CHAR случайно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2002, 14:06:44 |
|
||
|
Как правильно упорядочивать ?
|
|||
|---|---|---|---|
|
#18+
именно CHAR - мне это важно, а что теперь делать ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2002, 14:14:06 |
|
||
|
Как правильно упорядочивать ?
|
|||
|---|---|---|---|
|
#18+
Код: plaintext Только у Вас выборки разные - почему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2002, 14:31:54 |
|
||
|
Как правильно упорядочивать ?
|
|||
|---|---|---|---|
|
#18+
Не знаю, может создать calculated поле с типом INTEGER, в которое писать значения из этого поля и сортировать по нему. В Interbase это как-то решалось использованием collation (это такая хрень, которая задает порядок сортировки для различных языков, о моему :) ) ... детали не помню, может в MSSQL что-то подобное есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2002, 14:35:55 |
|
||
|
Как правильно упорядочивать ?
|
|||
|---|---|---|---|
|
#18+
К сожалению вариант с SELECT * FROM @t ORDER BY cast(number as int) не подходит так как в поле иногда встречается не только цифры, но и буквы (оно не просто так char) отсюда возникает ошибка (не может сделать это поле int) А выборки разные просто так - для наглядности, я писал их от руки. У Вас есть еще какие-нибудь соображения ? Заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2002, 17:35:11 |
|
||
|
Как правильно упорядочивать ?
|
|||
|---|---|---|---|
|
#18+
Пишите UDF-функцию, которая будет преобразовывать ваши значения в цифровой эквивалент. Вот пример простенькой: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Естественно, если у вас в поле одновременно могут хранится цифры и буквы, то пишите свой алгоритм распаковки значения поля. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2002, 17:46:30 |
|
||
|
Как правильно упорядочивать ?
|
|||
|---|---|---|---|
|
#18+
У Вас есть еще какие-нибудь соображения ? Соображения есть. Надо приводить полные исходные данные, уважаемый. Вот Вы говорите: как в поле иногда встречается не только цифры, но и буквы Какие буквы? A, B, C, D, E, F (то, что можно в HEX преобразовать) или нет? Если 'нет', то мы должны угадать алгоритм сравнения 'буквенных' и 'цифровых' значений? Удачи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2002, 17:58:00 |
|
||
|
Как правильно упорядочивать ?
|
|||
|---|---|---|---|
|
#18+
С замечаниями согдасен. Сори за невнфтность. Итак: могу добавить пожалуй одно. Физический смысл этого поля в моей таблице - это номер дома. А следовательно он может быть и 1a и 1/1 а сортировка типа 1 12 2 25 29 .... заказщика не устраивает. Что делать ? Спасибо за содействие. Андрей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2002, 21:26:33 |
|
||
|
Как правильно упорядочивать ?
|
|||
|---|---|---|---|
|
#18+
Могу предложить такое (использую в своих приложениях): дополняй номера домов в запросе '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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2002, 07:02:17 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32034137&tid=1822129]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
66ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 231ms |
| total: | 389ms |

| 0 / 0 |
