Topic: Поиск подстроки и без привязки к регистру через SQLзапрос

Добрый день!
Помогите со следующим скриптом:


procedure FrmNomenklature_MemNomenklature_OnChange (Sender: TObject);
var SMat, SQL : string;
begin
    Smat := (FrmNomenklature.MemNomenklature.sqlValue);

    SQL := 'Select DictNomenklature.Name AS "Номенклатура" From DictNomenklature WHERE DictNomenklature.Name == '+Smat+' COLLATE NOCASE ';
  
    FrmNomenklature.BTSQLHomenklature.dbSQL := sql;

end;

под MemNomenklature находится поле MEMO которое лишено плюшек как в Edit облегчающих поиск

В данном виде код работает но нужно чтоб поиск выдавал подстроку (результат по части найденного текста)
Почему то не работают такие как LIKE '%s%' - останавливается на стадии запуска
и WHERE instr (DictNomenklature.Name == '+Smat+', '' (здесь любой существующий в DictNomenklature.Name  символ '') - выдаёт результат без совпадений

2 (edited by sparrow 2022-01-14 10:45:01)

Re: Поиск подстроки и без привязки к регистру через SQLзапрос

Добрый,

LIKE "%string%" - где string строка для поиска и двойные кавычки,  поиск без учета регистра

SQL := 'SELECT name FROM DictNomenklature WHERE LIKE "%товар%";'

а функция instr должна иметь вид


instr( string, substring ) возвращает позицию найденной подстроки

SQL := 'SELECT instr(DictNomenklature.Name,"товар") AS POSITION FROM ...

возвращает позицию найденной подстроки
или

dbSQL:='SELECT id, name FROM DictNomenklature WHERE instr(DictNomenklature.Name,"товар");'

возвращает id и имя где найден результат. Регистрозависимый поиск

3 (edited by builov-maikl 2022-01-16 19:46:29)

Re: Поиск подстроки и без привязки к регистру через SQLзапрос

Добрый день.
Как не пробую ничего не выходит! код ниже выдает результат по части названия но он регистрозависимый

Select Name AS "Номенклатура"
From DictNomenklature 
WHERE Name LIKE "%БСТ%"

а этот регистронезависимый но по полному названию

Select Name AS "Номенклатура" 
From DictNomenklature 
WHERE Name == 'бСТ В20П4F150W6' COLLATE NOCASE

как получить результат регистронезависимый по части названия
и еще один нюанс т.к. я использую переменную, запрос вида:

SQL := 'Select Name AS "Номенклатура" From DictNomenklature WHERE Name LIKE "%'+Smat+'%"';

выдает пустой результат хотя по логике должен выдать

4 (edited by sparrow 2022-01-16 21:33:18)

Re: Поиск подстроки и без привязки к регистру через SQLзапрос

вот пример



И на счет логики:

Smat := (FrmNomenklature.MemNomenklature.sqlValue);
и почитайте про .sqlValue и .Text вот здесь http://myvisualdatabase.com/doc_ru/script_memo.html
Чем отличается .sqlValue от .Text ? содержит экранирующие кавычки

используйте Text
Smat := (FrmNomenklature.MemNomenklature.Text);

Post's attachments

Attachment icon test.zip 335 kb, 186 downloads since 2022-01-16 

Re: Поиск подстроки и без привязки к регистру через SQLзапрос

Спасибо огромное!
Всё получилось,

Чем отличается .sqlValue от .Text ? содержит экранирующие кавычки

теперь буду знать !)))