Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > И снова LIKE


Автор: PsiMagistr 31.1.2012, 12:20
Ребята,


Код


procedure TForm1.Button1Click(Sender: TObject);
var  s :string;
begin

s:='сандра';

Q.Active :=false;
Q.SQL.Clear;
Q.SQL.Add('select * FROM t WHERE fname LIKE ''%'+s+'%''');
Q.Active :=true;
end;

// Если В таблице t есть поля FName со значением, включающем в себя переменную s, то запрос вернет эти поля

//Например, если поле "Александра", а переменная s := 'сандра', то вернет, ибо поле в себя включает переменную.


Но мне необходим запрос, который проверял бы вхождение ПОЛЯ в переменную.

Огромное спасибо за помощь


Автор: Данкинг 31.1.2012, 13:18
СУБД? Access?
Код

Q.SQL.Add('select * FROM t WHERE  instr(1,fname,'+chr(39)+s+chr(39)+'<>0');

Автор: Frees 31.1.2012, 13:20
дак поменяй выражения местами
Код

Q.SQL.Add('select * FROM t WHERE '+QuotedStr(s)+' LIKE ''%''||fname||''%''');

Автор: PsiMagistr 31.1.2012, 14:40
Менял, но у меня прописать не получается...

Добавлено через 59 секунд
Данкинг, 
Frees, 

Спасибо.

Добавлено через 7 минут и 41 секунду
Frees, Invalid us in vertical bars...

Добавлено через 10 минут и 44 секунды
Данкинг, 

Missing ) ] or item in QueryExpression   ... ....

Автор: Данкинг 31.1.2012, 15:11
Цитата(PsiMagistr @  31.1.2012,  15:40 Найти цитируемый пост)
Missing ) ] or item in QueryExpression   ... .... 

Ну расставь скобочки-то:
Код

Q.SQL.Add('select * FROM t WHERE  instr(1,fname,'+chr(39)+s+chr(39)+')<>0');

Автор: PsiMagistr 31.1.2012, 15:27
Код

procedure TForm1.Button1Click(Sender: TObject);
var  s :string;
begin
s:='СтрокаАлександраСтрока';
Q.Active :=false;
Q.SQL.Clear;
Q.SQL.Add('select * FROM t WHERE  instr(1,fname,'+chr(39)+s+chr(39)+')<>0');
Q.Active :=true;





Расставил, ошибок нет, но и не возвращает ничего.  Поле fname со значением Александра точно есть.

Автор: Данкинг 31.1.2012, 15:51
А если поставить двойные кавычки, т.е. chr(39) заменить на chr(34) ?

Добавлено через 2 минуты и 8 секунд
Ну или для верности к одному регистру привести и пробелы в поле обрезать:
Код

Q.SQL.Add('select * FROM t WHERE  instr(1,trim(ucase(fname)),'+chr(39)+ansiuppercase(s)+chr(39)+')<>0');

Автор: PsiMagistr 1.2.2012, 11:50
Код


procedure TForm1.Button1Click(Sender: TObject);
var  s :string;
begin
s:='строкаАлександрасторока';
Q.Active :=false;
Q.SQL.Clear;
Q.SQL.Add('select * FROM t WHERE  instr(1,trim(ucase(fname)),'+chr(39)+ansiuppercase(s)+chr(39)+')<>0');
Q.Active :=true;
end;


Код

procedure TForm1.Button1Click(Sender: TObject);
var  s :string;
begin
s:='строкаАлександрасторока';
Q.Active :=false;
Q.SQL.Clear;
Q.SQL.Add('select * FROM t WHERE  instr(1,trim(ucase(fname)),'+chr(39)+ansiuppercase(s)+chr(39)+')<>0');
Q.Active :=true;
end;



Увы,  оба варианта возвращает пустыми... Что 39, что 34

Добавлено @ 11:58
Данкинг, 

Я сделал!

Благодарю Вас.

Во первых параметры надо местами поменять...


Код

procedure TForm1.Button1Click(Sender: TObject);
var  s :string;
begin
s:='строкаАлександраТест';
Q.Active :=false;
Q.SQL.Clear;
Q.SQL.Add('select * FROM t WHERE  instr(1, :d, FName)<>0');
Q.Parameters.ParamByName('d').Value := s;
Q.Active :=true;
end;


Автор: Данкинг 1.2.2012, 13:10
Цитата(PsiMagistr @  1.2.2012,  12:50 Найти цитируемый пост)
параметры надо местами поменять...

А, ну, возможно, хотя у меня вроде и так работало.

Автор: PsiMagistr 1.2.2012, 16:11
Данкинг, Оно и так работает, зависит какую строчку в какой ищем...

Автор: Akella 1.2.2012, 22:15
Use QuotedStr(), Luke.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)