[SORU]-SQL Sorgulamada Fazla Kriter Kullanma ?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
hi_selamlar
Üye
Mesajlar: 523
Kayıt: 05 May 2005 03:24
Konum: DelphiTürkiye.COM

[SORU]-SQL Sorgulamada Fazla Kriter Kullanma ?

Mesaj gönderen hi_selamlar »

S.A. Arkadaşlar,

Öncelikle bütün arkadaşların geçmiş ramazan bayramını kutlar, esenlikler dilerim.

Sorum ise şu?

Bir DB'de SQL (MySQL) kullanarak bazı verileri çekmek istiyorum. Kullanıcı bu verilerin hepsine göre veya bir kısmına göre sorgulamak istiyor.
Örneğin;
ADI, SOYADI, D.TARIHI, SEMT, IL, BABA ADI, VN, VD, TCNO , vs.vs.vs.vs.vs.gibi 15-20 kriter olacak.
Kullanıcı örneğin sadece ADI na göre veya hem ADI hemde İL le göre arama veya daha fazla kritere göre sorgulama yapacak.

Ben ise burda takıldım. Şimdi SQL de where ye bütün kriterleri yazıp ara dediğimde kayıtları bulamıyor. Çünkü kullanıcı bazı kriterleri boş geçiyor. Diğer türlü kullanıcının hangi alanlara göre arama yapmak istediğini bulmam biraz zorluyor beni.

Siz bu durumda bana n önerirsiniz. Sizler bu tarz durumlarda nasıl bir yol ve yöntem izliyorsunuz ? :?:

Sevgiler, Saygılar..

S.A.
Herkes cahildir, bazi konularda.
bgoktas
Kıdemli Üye
Mesajlar: 769
Kayıt: 27 Nis 2004 10:32
Konum: istanbul

Re: [SORU]-SQL Sorgulamada Fazla Kriter Kullanma ?

Mesaj gönderen bgoktas »

1-Önce select yapmak istediğin cümleyi yazın, sonuna where 1=1 koyun

Kod: Tümünü seç

select * from tablo where 1=1
2-daha sonra sorgulama kriterlerini belirleyeceğin edit,combobox,checkbox vs. bunların dolu veya boş olmalarına göre query'ini şekillendir.

Kod: Tümünü seç

if  adi.text<>'' then 
begin
query.sql.add('and adi=:adi');
query.params['adi'].asstring:=adi.text;
end;
Bu şekilde tüm kriterlerine göre queryni şekillendirip en son satırda query yi çalıştırmalısın

Kolay gelsin...
mkysoft
Kıdemli Üye
Mesajlar: 3103
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Re: [SORU]-SQL Sorgulamada Fazla Kriter Kullanma ?

Mesaj gönderen mkysoft »

dexpress kullanıyorsanız filter nesnesi var, sizin için sql'i otomatik hazırlayabilir.
Kullanıcı avatarı
hi_selamlar
Üye
Mesajlar: 523
Kayıt: 05 May 2005 03:24
Konum: DelphiTürkiye.COM

Re: [SORU]-SQL Sorgulamada Fazla Kriter Kullanma ?

Mesaj gönderen hi_selamlar »

bgoktas yazdı:1-Önce select yapmak istediğin cümleyi yazın, sonuna where 1=1 koyun

Kod: Tümünü seç

select * from tablo where 1=1
2-daha sonra sorgulama kriterlerini belirleyeceğin edit,combobox,checkbox vs. bunların dolu veya boş olmalarına göre query'ini şekillendir.

Kod: Tümünü seç

if  adi.text<>'' then 
begin
query.sql.add('and adi=:adi');
query.params['adi'].asstring:=adi.text;
end;
Bu şekilde tüm kriterlerine göre queryni şekillendirip en son satırda query yi çalıştırmalısın

Kolay gelsin...
S.A.

Hocam Where 1=1 anlamı nedir?

Bende 2. yöntemi kullanıyorum. Fakat kontrol etmesi daha basit bir yöntem olabilirmi, varmı acaba diye
siz değerli arkadaşlarımızdan destek istedim.

S.A.
Herkes cahildir, bazi konularda.
bgoktas
Kıdemli Üye
Mesajlar: 769
Kayıt: 27 Nis 2004 10:32
Konum: istanbul

Re: [SORU]-SQL Sorgulamada Fazla Kriter Kullanma ?

Mesaj gönderen bgoktas »

where 1=1 'i demezsen her kriter sorgulamasının başında, daha önceki kriterler sorguya eklendimi eklenmedimi diye sorgulaman gerekiyor eğer sorgulanmamışsa

Kod: Tümünü seç

where sorgun...
eğer daha önce kriter eklendiyse

Kod: Tümünü seç

and sorgun...
demen gerekiyor. where 1=1 diyerek her defasında and'le başlamayı garantilemiş oluyorsun.

Kolay gelsin.
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: [SORU]-SQL Sorgulamada Fazla Kriter Kullanma ?

Mesaj gönderen Lost Soul »

hi_selamlar yazdı:
bgoktas yazdı:1-Önce select yapmak istediğin cümleyi yazın, sonuna where 1=1 koyun

Kod: Tümünü seç

select * from tablo where 1=1
2-daha sonra sorgulama kriterlerini belirleyeceğin edit,combobox,checkbox vs. bunların dolu veya boş olmalarına göre query'ini şekillendir.

Kod: Tümünü seç

if  adi.text<>'' then 
begin
query.sql.add('and adi=:adi');
query.params['adi'].asstring:=adi.text;
end;
Bu şekilde tüm kriterlerine göre queryni şekillendirip en son satırda query yi çalıştırmalısın

Kolay gelsin...
S.A.

Hocam Where 1=1 anlamı nedir?

Bende 2. yöntemi kullanıyorum. Fakat kontrol etmesi daha basit bir yöntem olabilirmi, varmı acaba diye
siz değerli arkadaşlarımızdan destek istedim.

S.A.
where 1=1 deki amaç and bağlacı atandı mı atanmadımı kontrolünü yapmaktan kurtulmak içindir.

2. yöntem yerine

Kod: Tümünü seç

'...... and kayit_adi like ''%'+edit[n].text+'%''' 
veya

Kod: Tümünü seç

'...... and kayit_adi like :kayit_adi' 
query.parambyname('kayit_adi').AsString:='%'+edit[n].text+'%'
kullanırsanız boş bırakıp bırakmadığı sorgunuzu etkilemez. Böylece boş mu değill mi kontrol etmenize gerek kalmaz.

kolay gelsin.
Kullanıcı avatarı
hi_selamlar
Üye
Mesajlar: 523
Kayıt: 05 May 2005 03:24
Konum: DelphiTürkiye.COM

Re: [SORU]-SQL Sorgulamada Fazla Kriter Kullanma ?

Mesaj gönderen hi_selamlar »

Lost Soul yazdı: where 1=1 deki amaç and bağlacı atandı mı atanmadımı kontrolünü yapmaktan kurtulmak içindir.
kolay gelsin.
Hocam rica etsem bir kod örneği ile verirmisin ?
Örneğin ;

bu örnekte nasıl olması Where 1=1 ??

Kod: Tümünü seç

SELECT *FROM TABLO
WHERE (ADI=:ADI) AND (SOUADI=:SOYADI) AND (SEMT=:SEMT)
Teşekkürler...
Herkes cahildir, bazi konularda.
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: [SORU]-SQL Sorgulamada Fazla Kriter Kullanma ?

Mesaj gönderen Lost Soul »

hi_selamlar yazdı:
Lost Soul yazdı:

Kod: Tümünü seç

SELECT *FROM TABLO
WHERE (ADI=:ADI) AND (SOYADI=:SOYADI) AND (SEMT=:SEMT)
Teşekkürler...
where 1=1 dinamik parametreli sorgulara kolaylık sğalaması için kullanılır.

where 1=1 in anlamı 1; 1'e eşitse demektir ki bu da her zaman true değer döndüreceğinden

Kod: Tümünü seç

select * from tablo 
ile

Kod: Tümünü seç

select * from tablo where 1453=1453 
aynı değeri döndürecektir.

fakat örneğin çalışma anında sorgu üreteceğimiz zaman değişken parametre sayısına sahip sorgularımı olacaktır.
örneğin yukarıdaki örnek sorgunuzda hem AD hem SOYAD hem de SEMT için aynı anda sorgu yapacaksanız olduğu gibi yazarsınız.

Peki kimi zaman AD kimi zaman soyad kimi zaman Ad,Soyad ya da Soyad,Semt için soru yaparsanız nolacak.
o zaman and bağlaçlarını koyup koymayacağınıza nasıl karar vereceksiniz.

ya boolean cinsinden bir değer tutup eğer where bir kez kullanılmışsa and ekle yoksa where ekle diyeceksiniz.

Ex:

Kod: Tümünü seç

if WhereKondu then sorgu := sorgu + ' and [şart]...'
ya da
en başa where 1=1 gibi her zaman doğru olan bir şart koyup
gerektikçe şartlarınızı and ,or gibi bağlaçlar ile ile eklemeye devam edeceksiniz.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: [SORU]-SQL Sorgulamada Fazla Kriter Kullanma ?

Mesaj gönderen mrmarman »

Merhaba.

Özetle sorgunu şöyle kur..

Kod: Tümünü seç

With MySQL do begin
  SQL.Clear;
  SQL.Add( 'SELECT * FROM TABLO' );
  SQL.Add( 'WHERE 1=1' );
  If StrAdi  <> '' then SQL.Add('AND ADI = '+ QuotedStr(StrAdi) );
  If StrSemt <> '' then SQL.Add('AND SEMT = '+ QuotedStr(StrSemt) );
  ...
  ...
  Active := True;
end;
Eğer parametre kullanacaksan, aynı if sorgularını aşağıda aynı sırayla her satıra ait parametresi için kuracaksın.
Resim
Resim ....Resim
ikra
Üye
Mesajlar: 900
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: [SORU]-SQL Sorgulamada Fazla Kriter Kullanma ?

Mesaj gönderen ikra »

ve aleyna aleykum selam...

Kod: Tümünü seç

select alanlar from tablo where kriter1 like :kriter1 and kriter2 like :kriter2 and kriter3 like :kriter3
parambyname('kriter1').asstring := '%'+trim(isim.text)+'%';
parambyname('kriter2').asstring := '%'+trim(soyisim.text)+'%';
parambyname('memleket').asstring := '%'+trim(memleket.text)+'%';
eger kullanici yalnizca isim girerse parametreler sirasi ile söyle olacak

Kod: Tümünü seç

kriter1 = %ahmet%
kriter2 = %%
kriter3 = %%
ve like komutu ile ismi ahmet (ve yakin isim) olanlari alacak ve diger kriterler %% döndügü icin onlari es gececektir.

eger kullanici isim ve soy isim girerse parametreler sirasi ile söyle olacak

Kod: Tümünü seç

kriter1 = %ahmet%
kriter2 = %bayramoglu%
kriter3 = %%
ve like komutu ile ismi ahmet (ve yakin isim) olanlari ve soy ismi bayramoglu (ve yakin isim) olanlari alacak ve son kriter %% döndügü icin o'nu es gececektir.

kolay gelsin!
kıdemsiz üye
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: [SORU]-SQL Sorgulamada Fazla Kriter Kullanma ?

Mesaj gönderen mrmarman »

Birden çok kriter sorgulamasında like ile % joker sembolü ile kullanılırsa kolay kolay boşa düşmez. Yanlışlıkla arama kriterlerinden birine bir boşluk eklersen ve kayıtlarda içinde boşluk olan kayıtlar da gelir. Bu nedenle eğer like kullanmayı düşünüyorsan mümkün olduğunca arancak terimlri trim() fonksiyonundan geçirip sağ ve soldaki boşlukların temizlenmesini ihmal etme.
Resim
Resim ....Resim
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: [SORU]-SQL Sorgulamada Fazla Kriter Kullanma ?

Mesaj gönderen emin_as »

Kod: Tümünü seç

procedure  Tform1.Sorgula;
var
  str_where : string;   // where de kullanacagımız değer

  procedure  sorgu_str(alanadi, deger: string);
  begin
     if deger <>'' then
     begin
       if str_where <> '' then str_where:=str_where+' and ';
       str_where:=str_where+' alanadi = '+quotedstr(deger);
     end;
  end;
Sorgula isminde bir procedure tanımladık ve içinde yardımcı bir str_where değişkenimiz var, ayrıca bazı ek procedureler daha tanımlayacagız.

Kod: Tümünü seç

  procedure sorgu_int(alanadi: string; deger: integer);
  begin
     if deger > 0 then
     begin
       if str_where <> '' then str_where:=str_where+' and ';
       str_where:=str_where+' alanadi = '+IntToStr(deger);        
    end;
  end;
Bu yardımcı procedurelerden sonra esas procedure geçebiliriz.

Kod: Tümünü seç

begin
   dataset1.Close;
   str_where:='';  // where için kullanacagımız değişkeni sıfırlıyoruz.
   sorgu_str('adi',Edit1.Text);  // adi veritabanindaki field , edit1.text girilen ad
   sorgu_str('sehir',Edit2.Text);
   sorgu_int('turu',combobox1.itemindex);  // tur integer bir alan ve combobox1 de turler var. itemindex 0 gözardı edilecektir.
   .....  // istedigin kadar sorgulanacak alan ekle
   dataset1.selectsql.clear;
   dataset1.selectsql.add(' select * from tablo ');
   if str_where <> '' then dataset1.selectsql.add(str_where);
  dataset1.Open;
end;
Bu tür procedureler oluşturmanın avantajı, gerektiğinde programın bu bölümün istediğin gibi geliştirebilmendirk. Sorgu_like diye bir procedure ekleyip like sorgusu ve sorgu_tarih ekleyip tarih sorgusu da yaptırabilirsin. İlk başta biraz uğraştırıyor görünse de, bu tür kodlama daha esnek filtreleme sağlar.
Cevapla