Delphi выбирает SQL для поиска и в строках

Я выполняю запрос, чтобы найти строки, содержащие символ «&». и используя dbgrid, чтобы показать результат.

Я пытался написать запрос, как он работает в SQL Server или MYSQL.

FDQuery1.SQL.Text := 'SELECT * FROM DATA WHERE NAME LIKE ''%&%''';  
FDQuery1.Open();

Вместо получения результата, содержащего символ «&» в столбце NAME, он выбирает все строки, в которых столбец NAME не пуст.

Другие запросы работают, когда я нахожу «$» вместо «&» — вот так:

FDQuery1.SQL.Text := 'SELECT * FROM DATA WHERE NAME LIKE ''%$%''';   

Этот запрос выбирает строки, содержащие символ $.

Когда я использую это условие, выбираются только все ненулевые строки: %&%.

Delphi не является ядром базы данных и не выполняет ваши запросы. FireDAC передает ваш запрос в используемую вами СУБД, и этот механизм базы данных выполняет запрос. Вам необходимо добавить тег для ядра базы данных, которое вы используете (Access, MySQL, SQL Server и т. д.), поскольку именно на нем выполняется SQL.

Ken White 27.04.2024 15:01

@KenWhite FireDAC по умолчанию не передает запрос беспрепятственно, если он содержит какие-либо специальные символы, которые он использует для поддержки возможности предварительной обработки запроса/макросов. Ссылка: Специальная обработка символов

Brian 27.04.2024 18:01

@Brian: Это не меняет того факта, что Delphi не выполняет запрос. Это делает СУБД, а не язык разработки, и знание того, какая СУБД используется, все равно необходимо.

Ken White 27.04.2024 22:54
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
3
141
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

FireDAC имеет возможность предварительной обработки запросов/макросов, позволяющую дополнительный уровень модификации запросов. В некоторых функциях используется символ &, который означает, что необходимо соблюдать особую осторожность при написании запросов или отключении макросов. Его можно отключить на уровне соединения или запроса.

  FDConnection1.ResourceOptions.MacroExpand := false;
  FDQuery1.ResourceOptions.MacroExpand := false;

Переменные замены

Символ «&», за которым следует имя макропеременной. Например:

SELECT * FROM &TabName

Символы имеют следующее значение:

‘!’--режим подстановки «строка». Значение макроса будет подставлено «как есть», непосредственно в текст команды без каких-либо преобразований.

‘&’-– режим подстановки «SQL». Значение макроса будет подставлено в зависимости от типа данных макроса, используя правила синтаксиса целевой СУБД. К используйте макросы, используйте следующий фрагмент кода:

FDQuery1.SQL.Text := 'SELECT * FROM &TabName';
FDQuery1.MacroByName('TabName').AsRaw := 'Orders';
FDQuery1.Open;

Макросы обрабатываются, когда ResourceOptions.MacroCreate и MacroExpand установлены в True.

Ссылка: Предварительная обработка текста команды (FireDAC)

Другие вопросы по теме