powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Множественный выбор в запросе
44 сообщений из 44, показаны все 2 страниц
Множественный выбор в запросе
    #39951397
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги, подскажите есть запрос типа

Код: pascal
1.
select * from tab where tab.name in (:name_list)



Параметр name_list получаю из TStringList, вопрос правильно ли это и как сделать чтобы параметр принял значение типа:

'Вася','Петя', а не как 'Вася, Петя'.

Как делаете вы?
...
Рейтинг: 0 / 0
Множественный выбор в запросе
    #39951399
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnetправильно ли это

Нет, неправильно.

wsnetКак делаете вы?

Мы так не делаем.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Множественный выбор в запросе
    #39951404
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
select * from tab where :name_list like '%'+tab.name +'%'
...
Рейтинг: 0 / 0
Множественный выбор в запросе
    #39951411
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBr, не очень ясно, как это использовать?
...
Рейтинг: 0 / 0
Множественный выбор в запросе
    #39951420
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet,

Не использовать TStringList.DelimitedText бездумно не предлагать?
...
Рейтинг: 0 / 0
Множественный выбор в запросе
    #39951421
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMaster, да, но все же как вы реализуете задачу множественного выбора значений ?
...
Рейтинг: 0 / 0
Множественный выбор в запросе
    #39951424
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Извиняюсь, а как вы делаете, может подскажите?
...
Рейтинг: 0 / 0
Множественный выбор в запросе
    #39951425
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet,

1) Тебе нужно точное совпадение? Именно "Вася и Петя и Ваня"?
2) Я бы тупо слеил IN кляузу обычным циклом и прилепил к запросу.

Код: pascal
1.
2.
  for ..... do MyParam:=MyParam+''''+StringList.Strings[i]+''''+',';
  MyParam:=TrimLastChar(MyParam,',');
...
Рейтинг: 0 / 0
Множественный выбор в запросе
    #39951427
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnetа как вы делаете, может подскажите?

Обрабатываю выбранное по одному, в цикле. Это не требует запросов к серверу.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Множественный выбор в запросе
    #39951434
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

То есть прогоняете в цикле? Что-то типа этого?
Код: pascal
1.
2.
3.
4.
5.
While not Query.Eof do
Begin
If Query.FieldByName[name] := list[i]
...
End;
...
Рейтинг: 0 / 0
Множественный выбор в запросе
    #39951435
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMaster,

Да точное, нет, от склейки отказались.
...
Рейтинг: 0 / 0
Множественный выбор в запросе
    #39951438
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMaster, а в Myparam что будет в конечном счете?
...
Рейтинг: 0 / 0
Множественный выбор в запросе
    #39951441
wsnet,

Ну что бы не использовать склейку, используйте setlength сразу определённой длины, и функцию move. Совершенно не будет тормозить.


Ну или получите строку целиком, добавьте N количество через setlength и с конца перенесите с лева на право. Добавив символы. Тоже с move
...
Рейтинг: 0 / 0
Множественный выбор в запросе
    #39951443
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
wsnet,
Ну что бы не использовать склейку, используйте setlength сразу определённой длины, и функцию move. Совершенно не будет тормозить.

TStringBuilder уже не модно?
...
Рейтинг: 0 / 0
Множественный выбор в запросе
    #39951444
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Извиняюсь, а как вы делаете, может подскажите?
...
Рейтинг: 0 / 0
Множественный выбор в запросе
    #39951445
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный, пример можно?
...
Рейтинг: 0 / 0
Множественный выбор в запросе
    #39951454
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet
DimaBr, не очень ясно, как это использовать?

Так и использовать. В :name_list передавать список через зяпятую
...
Рейтинг: 0 / 0
Множественный выбор в запросе
    #39951467
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBr, если использовать left join и далее в where указать ваше условие, то почему-то выбираются все записи,
на одной таблице проблем нет. Как так может быть?
...
Рейтинг: 0 / 0
Множественный выбор в запросе
    #39951472
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBr, нет отрабатывает как надо! Спасибо за идею!
...
Рейтинг: 0 / 0
Множественный выбор в запросе
    #39951476
alekcvp

TStringBuilder уже не модно?


Да ну нафиг этот костыль. Мне лично эта прослойка совершенно не нужна.
...
Рейтинг: 0 / 0
Множественный выбор в запросе
    #39951486
wsnet
ВсеРазумный, пример можно?


Не актуально Да и ладно


Сначала убираем коретки переноса, потом умножаем на все '',_(пробел) убираем с конца лишние, и добавляем по пунктам.

Для оптимизации можно убрать inc и вложить в скобки индексы, и в конце inc-нуть(Но как то пофиг).

Если в конце есть перенос, всегда добавляет запятую с пробелом "'ss1,', 's2', ". Если строка кончается, и нет переносов, то будет "'ss1,', 's2'"

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
procedure TForm1.Button1Click(Sender: TObject);
var
  list, line: string;
  LCount, lenStr, LenEnd, offset, LenLine: Integer;
begin
  offset := 1;

  with Memo1.Lines do
  begin
    LCount := Count;
    lenStr := Text.Length - ((LCount - 1) * LineBreak.Length);
    LenEnd := (lenStr + (4 * LCount)) - 2;
  end;

  SetLength(list, LenEnd);
  for line in Memo1.Lines do
  begin
    LenLine := line.Length;
    list[offset] := '''';
    inc(offset);
    move(line[1], list[offset], LenLine * sizeof(line[1]));
    inc(offset, LenLine);
    list[offset] := '''';

    if offset < LenEnd then
    begin
      inc(offset);
      list[offset] := ',';
      inc(offset);
      list[offset] := ' ';
      inc(offset);
    end;
  end;

  ShowMessage(list);
end;
...
Рейтинг: 0 / 0
Множественный выбор в запросе
    #39951488
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Путей несколько

Первый, создаете на сервере таблицу с типа session_id, value и сливаете туда нужные Вам значения. После чего можете спокойно использовать эту таблицу для джойна со своим идентификатором session_id.
Путь второй, как вам уже сказали, строка с разделителем которую разбираете на сервере. Некое подобие этого решения передавать в параметре xml который обычно на сервере можно использовать для запросов. Но тут уже от возможностей сервера.
Путь третий, у некоторых sql серверов есть табличные параметры, т.е в качестве параметра на сервер передается Ваш датасет ну и соответственно там Вы его уже можете полноценно использовать как таблицу. Тут зависит от вашего сервера и компонентов которые вы используете, далеко не все это умеют.
...
Рейтинг: 0 / 0
Множественный выбор в запросе
    #39951491
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet
DimaBr, нет отрабатывает как надо! Спасибо за идею!

Советую формировать строку не через Запятую, а например так "<123><456><789>" и тогда запрос будет такого вида
Код: sql
1.
select * from tab where :name_list like '%<'+tab.name +'>%'
...
Рейтинг: 0 / 0
Множественный выбор в запросе
    #39951499
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnetа как вы делаете, может подскажите?

Вы не поверите, но разные вещи я делаю разными способами.

Может, уже скажете, что именно Вы пытаетесь сделать?
...
Рейтинг: 0 / 0
Множественный выбор в запросе
    #39951503
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так "без скобок"

И так "со скобками"
...
Рейтинг: 0 / 0
Множественный выбор в запросе
    #39951506
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMaster
wsnet,

1) Тебе нужно точное совпадение? Именно "Вася и Петя и Ваня"?
2) Я бы тупо слеил IN кляузу обычным циклом и прилепил к запросу.

Код: pascal
1.
2.
  for ..... do MyParam:=MyParam+''''+StringList.Strings[i]+''''+',';
  MyParam:=TrimLastChar(MyParam,',');


побаяню
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
function TrimLastChar(Text: string; C: Char): string;
begin
  if (Length(Text)>0) and (Text[Length(Text)]=C) then begin
    Result:=Copy(Text,1,Length(Text)-1);
  end else begin
    Result:=Text;
  end;
end;

begin
  var StringList:=TStringList.Create;
  StringList.Add(''');'#13#10'delete from tab;'#13#10'select * from tab where in (''');

  var MyParam:='';
  for var i:=0 to StringList.Count-1 do MyParam:=MyParam+''''+StringList.Strings[i]+''''+',';
  MyParam:=TrimLastChar(MyParam,',');

  WriteLn('select * from tab where in ('+MyParam+')');

  readln;
end.



Код: plaintext
1.
2.
select * from tab where in ('');
delete from tab;
select * from tab where in ('')
...
Рейтинг: 0 / 0
Множественный выбор в запросе
    #39951516
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
DarkMaster
wsnet,

1) Тебе нужно точное совпадение? Именно "Вася и Петя и Ваня"?
2) Я бы тупо слеил IN кляузу обычным циклом и прилепил к запросу.

Код: pascal
1.
2.
  for ..... do MyParam:=MyParam+''''+StringList.Strings[i]+''''+',';
  MyParam:=TrimLastChar(MyParam,',');


побаяню
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
function TrimLastChar(Text: string; C: Char): string;
begin
  if (Length(Text)>0) and (Text[Length(Text)]=C) then begin
    Result:=Copy(Text,1,Length(Text)-1);
  end else begin
    Result:=Text;
  end;
end;

begin
  var StringList:=TStringList.Create;
  StringList.Add(''');'#13#10'delete from tab;'#13#10'select * from tab where in (''');

  var MyParam:='';
  for var i:=0 to StringList.Count-1 do MyParam:=MyParam+''''+StringList.Strings[i]+''''+',';
  MyParam:=TrimLastChar(MyParam,',');

  WriteLn('select * from tab where in ('+MyParam+')');

  readln;
end.



Код: plaintext
1.
2.
select * from tab where in ('');
delete from tab;
select * from tab where in ('')


Хорошо, но данный код у меня не работает если в среде пропишем:
Код: pascal
1.
select * from tab where id in (:MyParam)



А в коде формируем MyParam:
Код: pascal
1.
2.
3.
var MyParam:='';
  for var i:=0 to StringList.Count-1 do MyParam:=MyParam+''''+StringList.Strings[i]+''''+',';
  MyParam:=TrimLastChar(MyParam,',');



Интересно почему так?
...
Рейтинг: 0 / 0
Множественный выбор в запросе
    #39951533
Gluck99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet
Интересно почему так?
Ну включи ты дебагер, поставь точку останова и посмотри что у тебя на выходе из цикла получается. И что именно "не работает"? Какой "код"? Код запроса ошибку даёт или цикл?
...
Рейтинг: 0 / 0
Множественный выбор в запросе
    #39951534
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnetИнтересно почему так?

Потому что ты не понимаешь как это работает и пытаешься делать странные вещи типа
"получить данные, которые уже здесь есть".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Множественный выбор в запросе
    #39951562
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet,

Вот здесь у тебя ID что?

Код: plsql
1.
select * from tab where id in (:MyParam)
...
Рейтинг: 0 / 0
Множественный выбор в запросе
    #39951594
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMaster
wsnet,

Вот здесь у тебя ID что?

Код: plsql
1.
select * from tab where id in (:MyParam)



Неверно выразился не id, а name, то есть запрос вида

Код: pascal
1.
select * from tab where name in (:MyParam)



MyParam собираю так:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
function TPageContractDepartmentEMKContract.ParamsAsStr(const AParams: TStringList): string;
var
  i: Integer;
begin
  Result := '';
  for i := 0 to AParams.Count - 1 do
  begin
    if Result <> '' then
      Result := Result + ', ';
    Result := Result + QuotedStr(AParams[i]);
  end;
end;



В итоге строка получается 'Вася','Петя', но запрос не выбирает эти записи, 0 redords.
...
Рейтинг: 0 / 0
Множественный выбор в запросе
    #39951596
GrigoriyFomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wsnet,

чтоб не городить огород, не лучше ль передать как макрос?
Код: sql
1.
select * from tab where name in (&MyMacro)


а в коде передать
Код: pascal
1.
dataset.macrobyname('mymacro').value:=MacroStr;
...
Рейтинг: 0 / 0
Множественный выбор в запросе
    #39951599
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrigoriyFomin
wsnet,

чтоб не городить огород, не лучше ль передать как макрос?
Код: sql
1.
select * from tab where name in (&MyMacro)


а в коде передать
Код: pascal
1.
dataset.macrobyname('mymacro').value:=MacroStr;



Не хочу макросы.
...
Рейтинг: 0 / 0
Множественный выбор в запросе
    #39951607
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wsnet
Не хочу макросы.


Если у тебя FireBird/Interbase, то можно 6686267
...
Рейтинг: 0 / 0
Множественный выбор в запросе
    #39951616
Gluck99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet
В итоге строка получается 'Вася','Петя', но запрос не выбирает эти записи, 0 redords.
1) Если запрос не выбирает записи, его надо запустить на другом клиенте. Последовательность в основном такая (особенно для сложных/громоздких запросов): сначала запрос пишется и отлаживается в конструкторе БД, где это делать легко и приятно, и только потом переносится в датасет или код. Поэтому сначала отладь запрос в другом месте, добейся корректного результата с конкретным набором условий и параметров, а уже потом пихай запрос в код.
2) Если запрос на другом клиенте отрабатывает, а из дельфы нет, то тогда смотрим что именно (целиком) уходит на сервер и сравниваем с тем, что отрабатывает корректно.
3) Но если ты упрямо не пользуешься отладчиком (он нужен в п. 2), когда тебе настоятельно советуют это сделать, ты будешь возиться с подобной фигнёй неделями, растрачивая своё и чужое время.
4) До сих пор нет полного кода: от формирования параметра и до отправки запроса.
...
Рейтинг: 0 / 0
Множественный выбор в запросе
    #39951623
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluck99До сих пор нет полного кода

До сих пор нет даже описания задачи. Только кривые попытки сделать что-то непонятное.
Какой-то список имён в TStringList, непонятно откуда-то взявшийся. Какой-то запрос,
непонятно зачем посылающийся на сервер (плюс намёки, что это не настоящий запрос, а чисто
для примера).

PS: А если копнуть, то может внезапно оказаться, что ни список, ни запрос не нужны, а достаточно пробежаться по записям, отмеченным галочкой в каком-нибудь EhGrid....
...
Рейтинг: 0 / 0
Множественный выбор в запросе
    #39951632
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

какой ты нудный... :)
...
Рейтинг: 0 / 0
Множественный выбор в запросе
    #39951654
wsnet,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
  public

    function GetFormat(const lines: TStringList): string;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(GetFormat(TStringList(Memo1.lines)));
end;

function TForm1.GetFormat(const lines: TStringList): string;
var
  list, line: string;
  LCount, lenStr, LenEnd, offset, LenLine: Integer;
begin
  offset := 1;

  with lines do
  begin
    LCount := Count;
    lenStr := Text.Length - ((LCount - 1) * LineBreak.Length);
    LenEnd := (lenStr + (4 * LCount)) - 2;
  end;

  SetLength(list, LenEnd);
  for line in lines do
  begin
    LenLine := line.Length;
    list[offset] := '''';
    inc(offset);
    move(line[1], list[offset], LenLine * sizeof(line[1]));
    inc(offset, LenLine);
    list[offset] := '''';

    if offset < LenEnd then
    begin
      inc(offset);
      list[offset] := ',';
      inc(offset);
      list[offset] := ' ';
      inc(offset);
    end;
  end;

  Result := list;
end;

end.

...
Рейтинг: 0 / 0
Множественный выбор в запросе
    #39951668
Если сравнить мою функцию с функцией которую используете


GetFormat - 8.169088
ParamsAsStr - 12.678366

Выгода составляет 4.249813 сек. При этом мы получаем
Код: sql
1.
'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675'



Аналогично функции ParamsAsStr
Код: sql
1.
'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675', 'r', 'rthrt', 't5u667i', 'yukyuky5675'




Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
  public
    ListS: TStringList;

    function GetFormat(const lines: TStringList): string;
    function ParamsAsStr(const AParams: TStringList): string;

    procedure Test_to_num;
    procedure Test_to_num2;

    function PrintTime(T: Int64): AnsiString;
  end;

var
  Form1: TForm1;

var
  T, T1, T3: Int64;
  i, A: integer;

function sprintf(S: PAnsiChar; const Format: PAnsiChar): integer; cdecl; varargs; external 'msvcrt.dll';

implementation

{$R *.dfm}

procedure TForm1.Test_to_num;
begin
  Memo1.lines.Add('GetFormat');
  QueryPerformanceCounter(T1);
  for A := 1 to 3 do
  begin
    for i := 0 to 100000 do
      GetFormat(ListS);
  end;
  Memo1.lines.Add(PrintTime(T1));
end;

procedure TForm1.Test_to_num2;
begin
  Memo1.lines.Add('ParamsAsStr');
  QueryPerformanceCounter(T);
  for A := 1 to 3 do
  begin
    for i := 0 to 100000 do
      ParamsAsStr(ListS);
  end;
  Memo1.lines.Add(PrintTime(T));
end;

function TForm1.PrintTime(T: Int64): AnsiString;
var
  A, b: Int64;
begin
  Result := '';
  if QueryPerformanceCounter(A) and QueryPerformanceFrequency(b) then
  begin
    SetLength(Result, 25);
    SetLength(Result, sprintf(PAnsiChar(Result), '%f', single((A - T) / b)));
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Test_to_num;
  Test_to_num2;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Clear;
  ListS := TStringList.Create;
  ListS.LineBreak := '';
  for i := 0 to 50 do
  begin
    ListS.Add('r');
    ListS.Add('rthrt');
    ListS.Add('t5u667i');
    ListS.Add('yukyuky5675');
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  ListS.Free;
end;

function TForm1.GetFormat(const lines: TStringList): string;
var
  list, line: string;
  LCount, lenStr, LenEnd, offset, LenLine: integer;
begin
  offset := 1;

  with lines do
  begin
    LCount := Count;
    lenStr := Text.Length - ((LCount - 1) * LineBreak.Length);
    LenEnd := (lenStr + (4 * LCount)) - 2;
  end;

  SetLength(list, LenEnd);
  for line in lines do
  begin
    LenLine := line.Length;
    list[offset] := '''';
    inc(offset);
    move(line[1], list[offset], LenLine * sizeof(line[1]));
    inc(offset, LenLine);
    list[offset] := '''';

    if offset < LenEnd then
    begin
      inc(offset);
      list[offset] := ',';
      inc(offset);
      list[offset] := ' ';
      inc(offset);
    end;
  end;

  Result := list;
end;

function TForm1.ParamsAsStr(const AParams: TStringList): string;
var
  i: integer;
begin
  Result := '';
  for i := 0 to AParams.Count - 1 do
  begin
    if Result <> '' then
      Result := Result + ', ';
    Result := Result + QuotedStr(AParams[i]);
  end;
end;

end.

...
Рейтинг: 0 / 0
Множественный выбор в запросе
    #39951703
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet
Коллеги, подскажите есть запрос типа

Код: pascal
1.
select * from tab where tab.name in (:name_list)



Параметр name_list получаю из TStringList, вопрос правильно ли это и как сделать чтобы параметр принял значение типа:

'Вася','Петя', а не как 'Вася, Петя'.

Как делаете вы?


Код: sql
1.
CREATE FUNCTION dbo.spMyFunc(@name_list VARCHAR(8000))...



Код: pascal
1.
SELECT * FROM spMyFunc(:name_list)
...
Рейтинг: 0 / 0
Множественный выбор в запросе
    #39951788
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, не ясно одно.

есть запрос

Код: pascal
1.
2.
3.
4.
var Q:OraQuery;
Q.SQL.Add(select * from test where test.id in (:param));
Q.ParamByName('param').asString := '123,133';
Q.Open;



Вывод 0 записей, хотя записи с данными id есть.

Вопрос почему?
...
Рейтинг: 0 / 0
Множественный выбор в запросе
    #39951789
Gluck99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet
Вопрос почему?
Потому что ТС упрямо игнорирует рекомендации и только причитает.
...
Рейтинг: 0 / 0
Множественный выбор в запросе
    #39951791
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnetВопрос почему?

Проблема в прокладке.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Множественный выбор в запросе
    #39951796
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
Если сравнить мою функцию с функцией которую используете
GetFormat - 8.169088
ParamsAsStr - 12.678366

А если вот так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
function TForm1.ParamsAsStr(const AParams: TStringList): string;
var
  i: integer;
begin
  if AParams.Count > 0 then
  begin
    with TStringBuilder.Create(QuotedStr(AParams[0])) do
    try
      for i := 1 to AParams.Count - 1 do
      begin
        Append(',"');     
        Append(AParams[i]);     
        Append('"');     
      end;
      Result := ToString(True);      
    finally
      Free;
    end;
  end else
    Result := '';
end;

?
...
Рейтинг: 0 / 0
44 сообщений из 44, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Множественный выбор в запросе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]