А можно как-нибудь обращаться к "секциям" запроса?

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
Antoxa
Сообщения: 169
Зарегистрирован: 06 июл 2006, 10:53

А можно как-нибудь обращаться к "секциям" запроса?

Сообщение Antoxa » 14 май 2008, 15:31

Можно обратиться к секции where или order by, или group by ?

Т.е. например есть запрос SELECT * FROM table1 WHERE field1=1

IBDataSet1.SQL(WHERE):='field2=2';

в результате запрос:

SELECT * FROM table1 WHERE field2=2

Antoxa
Сообщения: 169
Зарегистрирован: 06 июл 2006, 10:53

Re: А можно как-нибудь обращаться к "секциям" запр

Сообщение Antoxa » 14 май 2008, 15:33

Antoxa писал(а): IBDataSet1.SQL(WHERE):='field2=2';
IBDataSet1.SelectSQL(WHERE):='field2=2';

Kotъ-Begemotъ
Сообщения: 250
Зарегистрирован: 25 июл 2007, 21:33

Re: А можно как-нибудь обращаться к "секциям" запр

Сообщение Kotъ-Begemotъ » 14 май 2008, 15:42

Ну, можно использовать FibDataset там есть макросы, можно вообще чёрта лысого сделать, а не только условие во WHERE поменять :) Как вариант.

dragon_art
Сообщения: 18
Зарегистрирован: 20 сен 2006, 09:18

Re: А можно как-нибудь обращаться к "секциям" запр

Сообщение dragon_art » 15 май 2008, 08:05

создай запрос с параметрами.
типа:

Код: Выделить всё

select
  f1,
  f2,
  f3
from
  t1
where
  f1=:prmF1
перед открытием делай:

Код: Выделить всё

IBDataSet1.ParamByName('prmF1'):=something;
ps: давно занялся программированием и БД?

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Re: А можно как-нибудь обращаться к "секциям" запр

Сообщение WildSery » 15 май 2008, 12:34

dragon_art писал(а):ps: давно занялся [censored] ?
Прежде чем писать всякое, почитай чего хочет автор.
Какой параметр я должен подставить в твой запрос, если хочу изменить поле для сравнения?

KKomov
Сообщения: 14
Зарегистрирован: 20 дек 2007, 17:30

Re: А можно как-нибудь обращаться к "секциям" запр

Сообщение KKomov » 15 май 2008, 14:24

Antoxa писал(а):Можно обратиться к секции where или order by, или group by ?

Т.е. например есть запрос SELECT * FROM table1 WHERE field1=1

IBDataSet1.SQL(WHERE):='field2=2';

в результате запрос:

SELECT * FROM table1 WHERE field2=2
Вот как нечто подобное сделал я.

Сначала нам понадобится инструментарий:

Код: Выделить всё

//копия хвоста
String CopyTail(String s, int pos)
{
    return s.SubString(pos, s.Length()-pos+1);
}

//отрезать хвост
void CutTail(String *s, int pos)
{
    s->Delete(pos, size(s)-pos+1);
}

//перенести хвост, начиная с данной подстроки
void MoveTail(String *s, String mark, String *tail)
{
    int pos = s.Pos(mark);
    if(pos == 0)
    {
        *tail = "";
        return;
    }

    *tail = CopyTail(*s, pos);
    CutTail(s, pos);
}
Затем условимся во всех наших запросах начинать секции SELECT, FROM и т.д. с новой строки. После чего сочиним вот такой потрошитель:

Код: Выделить всё

//разделить оператор SQL на части
void SplitSQL(String SQL, String *S, String *F, String *W, String *O, String *G, String *H)
{
    MoveTail(&SQL, HAVING, H);
    MoveTail(&SQL, GROUP_BY, G);
    MoveTail(&SQL, ORDER_BY, O);
    MoveTail(&SQL, WHERE, W);
    MoveTail(&SQL, FROM, F);
    *S = SQL;
}
По конкретному вопросу секции WHERE:

Код: Выделить всё

//задать секцию WHERE
void SetWhereList(TStrings *SQL, String s)
{
    String S, F, W, O, G, H;
    SplitSQL(SQL->Text, &S, &F, &W, &O, &G, &H);
    W = "";
    if(s != "")
        W = String("WHERE\n")+s+"\n";
    //аккуратно упакуем
    SQL->Text = S+F+W+O+G+H;
}
Теперь можно так:

Код: Выделить всё

SetWhereList(IBDataSet1.SQL, "field2=2");

dragon_art
Сообщения: 18
Зарегистрирован: 20 сен 2006, 09:18

Re: А можно как-нибудь обращаться к "секциям" запр

Сообщение dragon_art » 15 май 2008, 16:50

WildSery писал(а):...
прошу прощения у Antoxa...

вариант: юзать динамические запросы.
или то, что предлагает Kotъ-Begemotъ

Ответить