butun terimler icin arama sorgusu

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

butun terimler icin arama sorgusu

Mesaj gönderen gkimirti »

bir Haftasonu sorusu sorayım:
bir string alandaki veri birden fazla kelime icersin
ben 2 yada daha fazla kelime icin nasıl bir sql yazmalıyım

ornegin alan degeri 'gökmen deneme kayıtı'
aranacak : kayıt gökmen

daha da ileri gidelim kelimelerde de icerenleri bulmaya calıssak
yani yukardaki ornek icin
aranacak : den gökmen :?:
dedigimde bulsun getirsin :)

Butun bunlar Firebird icin sorulmustur.
Sp,UDF kullanılabilir.
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Re: butun terimler icin arama sorgusu

Mesaj gönderen husonet »

gkimirti yazdı:bir Haftasonu sorusu sorayım:
bir string alandaki veri birden fazla kelime icersin
ben 2 yada daha fazla kelime icin nasıl bir sql yazmalıyım

ornegin alan degeri 'gökmen deneme kayıtı'
aranacak : kayıt gökmen

daha da ileri gidelim kelimelerde de icerenleri bulmaya calıssak
yani yukardaki ornek icin
aranacak : den gökmen :?:
dedigimde bulsun getirsin :)
Hocam bence bir fonksiyon hazırlayabilirsiniz. Gönderilen değer tabloda bulunamadıysa striglerin yerini değiştirip or parametresi ile SQL imizi genişetip sorgu gönderebiliriz tekrar bulamazsa araya özel karakterler yerleştirmeyi düşünebilirsiniz _ % ama ne kadar performanslı olur bilemiyorum :(

Sadece bir fikir.

Kolay Gelsin....

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2380
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Mesaj gönderen freeman35 »

Bunu delphi de function içinde çok rahat yapabilirsin, sonda bunu UDF olarak kullanırsın :) @Hüsonet in dediği gibide olur ama kelimelerin yerleri farklı olursa yada aranan bir parça ise ve rastgele yerde olabilecekse, FB de bu baya bi takla perende ve çeşitli atraksiyonlar kombinasyonu gerektirir. Ayrıca Yanlış hatırlamıyorsam Like index kullanmaz ve ilk kayıttan son kayıda kadar sırada okuyarak karşılaştırı, ve bunda eğer kayıt sayısı çok ise çok yavaş olur.

Kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
onaydin

Mesaj gönderen onaydin »

gökmen hocam şimdi sende bunun cevabı da vardır :)
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

isin aslı bende bilmiyorum cevabını :)
yani bu olayı str udfleri vs. kullanarak bir sp de yapabiliriz, ama aklıma
php sitelerde (mesela forumda) arama ksımları geldi.
acaba sql ile yapılabilecek basit bir yolu varmı diye.
sanırım orada da php script ile yapılıyor
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

ewt dedigim gibi SP ler ile yapılamayacak birsey degil
kendi tablom icin yaptım gayet te iyi calısıyor..

Kod: Tümünü seç

CREATE PROCEDURE ADV_PART_SEARCH (
    ARA VARCHAR(20))
RETURNS (
    ID INTEGER,
    ADI VARCHAR(50),
    PART_NO VARCHAR(20))
AS
DECLARE VARIABLE FIRSTREC INTEGER;
DECLARE VARIABLE DEG VARCHAR(20) CHARACTER SET WIN1254;
DECLARE VARIABLE SQL VARCHAR(200) CHARACTER SET WIN1254;
begin
  firstrec=1;
  sql='select p.id,p.adi,p.part_no from parts p where (1=1)';
  for select deger from p_splitstring(' ',:ARA) into :DEG
  do
  begin
    if (firstrec=1) then
      sql=sql || ' and (p.adi like '''||:DEG||'%'')';
    else
      sql=sql || ' and (p.adi like ''%' ||:DEG|| '%'')';
    firstrec=0;
  end

  for execute statement sql into :ID,:ADI,:PART_NO do
    suspend;
end
gerekli bir sp ve UDF ler var

Kod: Tümünü seç

CREATE PROCEDURE P_SPLITSTRING (
    AYIRAC VARCHAR(1),
    METIN VARCHAR(355))
RETURNS (
    DEGER VARCHAR(10))
AS
DECLARE VARIABLE P INTEGER;
DECLARE VARIABLE SEP VARCHAR(1);
begin
    if (AYIRAC is null) then
      AYIRAC=' ';
    --SON KARAKTER AYIRAC DEGILSE AYIRAC EKLENIR
    if (AYIRAC=' ') then
       METIN=rtrim(METIN) || ' ';
    else
      if (cast(SUBSTR(:METIN,STRLEN(METIN),1) as varchar(1))<>AYIRAC) then
           METIN=METIN || AYIRAC;


    select DONEN from POS(:AYIRAC,:METIN) into :P;
    while(P <> 0) do
    begin
         --string ayıklanır
         DEGER= SUBSTR(:METIN,1,:P-1 );
         --ayıklanan string cıkartılır.
         METIN=SUBSTR(:METIN,:P+1,STRLEN(:METIN));
         --ayırac tekrar aranır
         select DONEN from POS(:AYIRAC,:METIN) into :P;
         suspend;
    end
end
mesela ornek bir arama 'KA KONT PA'
sonuc 'KASA KONTROL PANOSU'
olay bundan ibaret:)
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

Elinize Sağlık Hocam bunu Makale ve İpucu kısmına da atarsanız güzel olur.

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

aklımda olsun bos bir anımda duzenleyip ornek bir tablo ile makaleleştiririm
ÜŞENME,ERTELEME,VAZGEÇME
ASE
Kıdemli Üye
Mesajlar: 518
Kayıt: 28 Ağu 2003 03:17
Konum: samsun
İletişim:

Mesaj gönderen ASE »

Arkadaşlar merhaba. Uzun zamandır aranızda yokum. Malum Askerdeyim. Ama burda da duramadım bir progrm yapmaya başladım. Lakin Tam burda takıldım.

peki sp desteklemeyen bir veritabanında bunu nasıl yaparız. Örn. Accesc
Yani alandaki kelimelerin herhengi biri ile nasıl arama yaparız.
Allah'ım!...
Yol boyunca bırakma elimi...
Düşerim sonra...


ASE YAZILIM
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

sorgu kelimesini bosluk karakterine göre parcalayacaksın once
sonra gerekli sql cumlesini olusturacaksın delphi tatafında
ben sana sp ile yaptıgımı gondereyim

Kod: Tümünü seç

   
  sqlstr='select x.id,x.parcaadi, X.newprice '||
         'from tablom X where (1=1)';

 for select q from p_splitstring(' ',:PARCAENG) into :DEG do
      sqlstr=sqlstr || ' and (x.parcaadi like ''%'||:DEG||'%'')';
    sqlstr=sqlstr || ' order by x.parcaadi';
p_splitstring adından da anlasılacagı uzere string parcalayan bir sp
her string degerini DEG degiskenine aktarıyor
her bir string icin and ile birbirine ekli where cumlesini olusturuyoruz
olay bu kadar basit yani....
ÜŞENME,ERTELEME,VAZGEÇME
Cevapla