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;
}
Теперь можно так: