Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.08.2009, 14:43   #1
tatiana__
Пользователь
 
Регистрация: 20.08.2009
Сообщений: 16
По умолчанию Сортировка по частям одного поля

Delphi7. Таблицы типа dBase. технология BDE, Query, Dbgrid
Запрос
Query1.SQL.Text:=
'SELECT A.ICODE,A.NAME,B.KRNAM,C.KRNAM,A.PR IMECH1,A.PRIMECH2,'+
'A.PRIM,A.IPR,A.ITU,A.Q,A.H,A.NVR,A .QMIN,A.QMAX,A.KPD,A.IST,'+
'A.NS,A.NPSH,A.CKR,S.NAM,D.NAM,A.KO RP,T.NAM,E.NAM,F.NAM,G.NAM,H.NAM,I. Nam,'+
'J.NAM,K.NAM,L.NAM,M.NAM,A.D2,A.P1, A.P2,N.NAM,A.T1,A.T2,A.RO,'+
'A.NU,O.NAM,P.NAM,Q.NAM,R.NAM,A.EDV ,A.MAS,A.ISPOL,A.GODVIP,A.ZAM1,'+
'A.ZAM2,A.ZAM3 FROM "NASOS.dbf" As A,"SPRZAKAZ.dbf" As B,"SPRSTRAN.dbf" As C,'+
'"SPRTNAS.dbf" As D,"SPRPODV.dbf" As E,"SPROTV.dbf" As F,"SPRRAZG.dbf" As G,"SPRUPL.dbf" As H,'+
'"SPRPODSH1.dbf" As I,"SPRPODSH2.dbf" As J,"SPRMSUS1.dbf" As K,"SPRMSUS2.dbf" As L,"SPRMUF.dbf" As M,'+ '"SPRSREDA.dbf" As N,"SPRMVAL.dbf" As O,"SPRMRK.dbf" As P,"SPRMNA.dbf" As Q,"SPRMKOR.dbf" As R,'+
'"SPRNANAS.dbf" As S,"SPRSHNEK.dbf" As T WHERE (A.KZAK=B.KZAK) and (A.KSTR=C.KSTR) and '+
'(A.KORIEN=S.KORIEN) and (A.KTIP=D.KTIP) and (A.SHNEK=T.SHNEK) and '+
'(A.KPODV=E.KPODV) and (A.KOTV=F.KOTV) and (A.KRAZG=G.KRAZG) and (A.KUPL=H.KUPL) and '+
'(A.KPODSH1=I.KPODSH) and (A.KPODSH2=J.KPODSH) and (A.KMSUS1=K.KMSUS) and (A.KMSUS2=L.KMSUS) and '+
'(A.KMUF=M.KMUF) and (A.KSR=N.KSR) and (A.KMVAL=O.KMAT) and (A.KMRK=P.KMAT) and (A.KMNA=Q.KMAT) and (A.KMKOR=R.KMAT)'+
' order by ICODE';
По нажатию на кнопках надо сортировать поле по убыванию и возрастанию. Все нормально. Использую order by <имя поля>.
Но есть поле IPR, которое принимает такие значения, например: Н78.06.000 00 ТУ, Н06.23.00.00-10, Н12.153.000.00-03, Н12.153.000.00, Н06.18.10, Н19.10, Н171.35, У181.37. Заказчик хочет, чтобы это поле было отсортировано так:
сначала до первой точки, потом до второй, до третьей и после третьей. Но точек бывает и 3, и 2, и 1. И от точки до точки - разное количество знаков. Надо создавать какой-то очень сложный запрос, до которого я додуматься не могу. Везде поискала. Нашла что-то очень отдаленно напоминающее. Но приспособить к своему случаю не смогла. Если можете, помогите, пожалуйста. Заранее благодарю.

Последний раз редактировалось tatiana__; 20.08.2009 в 14:57.
tatiana__ вне форума Ответить с цитированием
Старый 20.08.2009, 15:04   #2
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

могу предложить такой вариант - нужно выделить все числовые куски из поля и сортировать по ним
если получится, то лучше это сделать в самом запросе
если нет, то придется добавлять новые поля в соответствии с максимальным кол-вом чисел (например, 3 поля) и заполнять их для новых записей при вставке. старые отапдейтить - а способ: либо руками, либо писать процедуру
soleil@mmc вне форума Ответить с цитированием
Старый 20.08.2009, 15:08   #3
tatiana__
Пользователь
 
Регистрация: 20.08.2009
Сообщений: 16
По умолчанию

Но там есть и буквы и - (дефис)

Последний раз редактировалось tatiana__; 20.08.2009 в 15:44.
tatiana__ вне форума Ответить с цитированием
Старый 20.08.2009, 15:58   #4
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

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

пример решения для оракла влоб
преобразую к числовому виду только первые два числовых интервала
Код:
with 
  t as
  (select 'Н78.06.000 00 ТУ' tu from dual union all
  select 'Н06.23.00.00-10' from dual union all
  select 'Н06.23.00.03-10' from dual union all
  select 'Н06.23.00.00-12' from dual union all
  select 'Н06.23.00.10-10' from dual union all
  select 'Н78.06.000 03 ТУ' from dual union all
  select 'Н12.153.000.00-03' from dual union all
  select 'Н12.153.000.00' from dual union all
  select 'Н06.18.10' from dual union all
  select 'Н06.18.10.12' from dual union all
  select 'Н19.10' from dual union all
  select 'Н171.35' from dual union all
  select 'Н171' from dual union all
  select 'У181.37' from dual)
  
select
  tu,
  substr(tu, 1, 1) zero_digit,
  to_number(nvl(substr(tu, 2, case 
                    when f1 = last_digit then last_digit
                    else f1 - 2 end), '0')) first_digit,
  to_number(nvl(substr(tu, f1 + 1, case 
                         when f2 = last_digit then last_digit
                         else f2 - f1 - 1 end), '0')) second_digit,
  nvl(substr(tu, f2 + 1, case 
                         when f3 = last_digit then last_digit
                         else f3 - f2 - 1 end), '0') third_digit,
  nvl(substr(tu, f3 + 1, case 
                         when f4 = last_digit then last_digit
                         else f4 - f3 - 1 end), '0') fourth_digit
from(
      select  
        tu,  
        decode(instr(tu, '.', 1, 1), 0, length(tu), instr(tu, '.', 1, 1)) f1,
        decode(instr(tu, '.', 1, 2), 0, length(tu), instr(tu, '.', 1, 2)) f2,
        decode(instr(tu, '.', 1, 3), 0, length(tu), instr(tu, '.', 1, 3)) f3,
        decode(instr(tu, '.', 1, 4), 0, length(tu), instr(tu, '.', 1, 4)) f4,
        length(tu) last_digit
      from t)
order by 2, 3, 4, 5, 6
2 ТС
вряд ли у вас есть даже аналог используемых фунок
именно поэтому я говорю, что нужно под эту задачу затачивать табличку с этими данными (вводить новые поля для хранения интервалов - из моего примера выходит минимум 5 новых полей)

Последний раз редактировалось soleil@mmc; 20.08.2009 в 16:14.
soleil@mmc вне форума Ответить с цитированием
Старый 21.08.2009, 15:41   #5
tatiana__
Пользователь
 
Регистрация: 20.08.2009
Сообщений: 16
По умолчанию

Я написала, что таблицы типа dBase, что выделять я знаю, а как в запросе это сделать - не знаю.
Функций таких тоже нет.

Последний раз редактировалось tatiana__; 21.08.2009 в 16:51.
tatiana__ вне форума Ответить с цитированием
Старый 21.08.2009, 17:41   #6
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

Цитата:
Сообщение от tatiana__ Посмотреть сообщение
Я написала, что таблицы типа dBase, что выделять я знаю, а как в запросе это сделать - не знаю.
Функций таких тоже нет.
а я вот тоже много чего написал, а ты читать не хочешь

Цитата:
Сообщение от soleil@mmc Посмотреть сообщение
могу предложить такой вариант - нужно выделить все числовые куски из поля и сортировать по ним
если получится, то лучше это сделать в самом запросе
если нет, то придется добавлять новые поля в соответствии с максимальным кол-вом чисел (например, 3 поля) и заполнять их для новых записей при вставке. старые отапдейтить - а способ: либо руками, либо писать процедуру
soleil@mmc вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Очистка одного поля в таблице EugeneIsmatulin Общие вопросы Delphi 2 10.06.2009 16:55
Возможно ли использование нескольких столбцов подстановки для одного поля? jonni Microsoft Office Access 10 20.05.2009 22:25
Перетаскивание значения одного поля в другое inret Общие вопросы Delphi 3 09.05.2008 15:26
Сортировка в StringGrid'е, копирование строк из одного SG в другой monushka Помощь студентам 3 29.10.2007 23:54
Присвоение значения одного поля другому frai БД в Delphi 2 20.09.2007 15:03