ileri seviye SQL Kelime Arama

Yapmak istediğiniz işle ilgili doğru bileşeni bulmak için burayı kullanabilirsiniz. Sadece bulmak için, diğer sorular Programlama forumuna lütfen.
Forum kuralları
Bu forum sadece yapacağınız işle alakalı doğru bileşeni bulmak içindir. Şöyle bir şey yapmam lazım, hangi bileşeni kullanıyım diyorsanız, doğru yerdesiniz.
Cevapla
hbilal
Üye
Mesajlar: 18
Kayıt: 04 Ara 2010 12:13

ileri seviye SQL Kelime Arama

Mesaj gönderen hbilal »

Merhaba arkadaşlar.
delphi7 ve sql konusunda yardımınıza ihtiyacım var.
MySql veritabanında tek kolonlu bir veri içerisinde;
örn;

stok_adi
------------------------------------
Ülker çikolatalı gofret
Eti top kek
ülker süt
eti bank
-------------------------------------
Bu kolon içerisinde SQL komutu ile arama yapmam lazım, şöyle ki!

Kod: Tümünü seç

Procedure ............
var
aranan: string;
begin
aranan:='''%'+StringReplace(Edit1.text,' ','%',[rfReplaceAll, rfIgnoreCase])+'%''';

Edit1.text:=’ülk çi gof’; //Yazım sırasına dikkat

Query1.SQL.Add('SELECT * FROM stok.urunler');
Query1.SQL.ADD('Where (stok_adi like '+mask+')  limit 50'); 
end;
Bu şekilde edit1 e yazdığım sonucu alıyorum.


Yardımcı olacağınız kısım;

Kod: Tümünü seç


edit1.text := ' gof ülk çik'; //Yazım sırasına dikkat

karışık yazılmış kelimeleri araması için ne yazmalı?

StringReplace ,
ParamByName,
where' + quotedstr(stok_adi )
SELECT match(stok_adi )
( CASE WHEN stok_adi IS NOT NULL THEN stok.urunler LIKE concat ('%', stok_adi , '%') ELSE 1 END)
vs.. denemediğim kod kalmadı.

Kendinize çok iyi bakın. Allah’a emanet olun.
Saygılarımla.
gaus
Üye
Mesajlar: 227
Kayıt: 14 May 2014 07:36
İletişim:

Re: ileri seviye SQL Kelime Arama

Mesaj gönderen gaus »

Merhabalar öncelikle boşluk karekteri orada dikkatimi çekti.Bunun için özel bir arama methodu geliştirebilirsiniz.
Öncelikle ;

Kod: Tümünü seç

procedure Split(Delimiter: Char; Str: string; ListOfStrings: TStrings) ;
begin
   ListOfStrings.Clear;
   ListOfStrings.Delimiter       := Delimiter;
   ListOfStrings.StrictDelimiter := True; // Requires D2006 or newer.
   ListOfStrings.DelimitedText   := Str;
end;
procedürü ile edite yazılan kelimeleri almaya çalışalım.

sonra arama yaptıracağınız butonun içine procedürü çağıralım .
Daha sonra birde arama koşulu oluşturucu bir fonksiyon yazalım.

Kod: Tümünü seç

 function kosulgetir(ts:TstringList):String;
 var
  i:Integer;
  res:String;
 begin
  res:='';
  for i:=0 to ts.items.count-1 do
   begin
    res := res + ' or Alanim like  '+''''+'%'+ts.items[i]+'%'+'''';
   end;
   result :=res;
 end;
fonksiyonu ile koşul oluşturucu fonksiyon yazalım.

Kod: Tümünü seç

var
   OutPutList: TStringList;
   sqlsorgu : String;
begin
   OutPutList := TStringList.Create;
   try
     Split(' ', edit1.text, OutPutList) ;
     sqlsorgu := 'select * from tablom where Id>0 '+kosulgetir(outputlist);
     //dahasonrası query çalıştırmak
    finally
     OutPutList.Free;
   end;
end.
Umarım size bir fikir verebilmiştir.
hbilal
Üye
Mesajlar: 18
Kayıt: 04 Ara 2010 12:13

Re: ileri seviye SQL Kelime Arama

Mesaj gönderen hbilal »

Çok teşekkür ederim. Başarılı ve yeterince mantıklı kod paylaştınız.
işimi gördü, fakat araştırmalarım sonucu

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
mask : string;
begin
 mask:='+'+StringReplace(Edit1.text,' ','* +',[rfReplaceAll, rfIgnoreCase])+'*';
 if Edit1.Text > '' then
 begin
    Query1.Close;
    Query1.SQL.Clear;
    Query1.SQL.Add('SELECT * FROM stok.urunler');
    Query1.SQL.Add('WHERE MATCH(stok_adi) AGAINST("'+mask+'" IN BOOLEAN MODE) limit 300;');
    Query1.Open; 
    end; 
    end;

Kod: Tümünü seç

MATCH(stok_adi) AGAINST("'+mask+'" IN BOOLEAN MODE)
Bu kodun varlığını buldum, hem istediğim gibiydi hemde hızlıydı. Ama bu kodu kullanamadım. Sebebi ise, kelime kısıtlaması var gibi, yani R9 veya SLX kelimelerini bir türlü bulamıyor. Çözümünüde bulamadım. Şuan sizinkini kullanıyorum.
Allah'a emanet olun.
Cevapla