none
SQL'de Filtre Yazmak? RRS feed

  • Soru

  • Selamlar;

    Bir Tabloda bulunan alanlardan örneğin adı, soyadı, şehri, meslek gibi bir kaç tane alanlan verisine göre filtre yapmak istiyorum. Örneğin adı "e" ile soyadı "g" ile mesleği "öğretm" ile ve şehri "ist" ile başlayan kayıtları getirmek istiyorum. Alanların kimini boş bırakabilirim, kimine 1 harf kimine bir kaç harf girebilirim gibi...

    Bunu Stored Procedure haline getirip alan değerlerini parametre geçmek istiyorum ancak filtre sql'ini nasıl yazabilirim onu bilmiyorum?

    Yardımcı olursanız sevinirm.

    Teşekkürler.

    10 Nisan 2012 Salı 08:15

Yanıtlar

  • User Table

    UserName

    UserSurName

    UserCountry

    UserJops

    die bir tablon olsun

    create procedu2re  Sp_Filter

    (

    @UserName nvarchar(50), @UserSurName nvarchar(50),@UserCountry nvarchar(50), @UserJops nvarchar(50)

    )

    as

    Select * from userTAble where UserName like '%' + @UserName +'%' or Userjops like '%'+ @UserJops +'%' or UserCountry like '%' + @UserCountry + '%'

    gibi bir procedure yaratabilirsin mesela

    • Yanıt Olarak Öneren CetinBasoz 10 Nisan 2012 Salı 11:38
    • Yanıt Olarak İşaretleyen Oxijen 11 Nisan 2012 Çarşamba 12:26
    10 Nisan 2012 Salı 10:48
  • BKRHBK rumuzlu arkadasin dedigi gibi olabilir ama OR yerine AND kullanman gerekiyor, bir de '%'+...+'%' seklinde degil, ...+'%' seklinde olacak (icinde gecen degil, ile baslayan ariyorsun). Yoksa hem sorgularin daha yavas olur hem de ornegin sadece bir tanesi bos gecilse tum kayitlari alirsin.

    Ben sahsen bunun icin bir SP yaratmazdim. Duruma gore SQL olusturup onu gonderirdim SQL server'a. Mesela, bosuna, girilmemis alani sorgulatmanin anlami yok. Bunu .Net'den yapiyorsan LinqToEF ya da LinqToSQL ile cok basit. Ornek:

    string ad = "e";
    string soyad = "g";
    string meslek = "öğretm";
    string sehir = "ist";
    
    var data = from row in db.TabloAdi
       where 
    ( String.IsNullOrEmpty( ad ) || row.Ad.StartsWith(ad) ) &&
    ( String.IsNullOrEmpty( soyad ) || row.Soyad.StartsWith(soyad) ) &&
    ( String.IsNullOrEmpty( meslek ) || row.Meslek.StartsWith(meslek) ) &&
    ( String.IsNullOrEmpty( sehir ) || row.Sehir.StartsWith(sehir) )
       select row;

    Ya da metod syntaxi ile:

    string ad = "e";
    string soyad = "g";
    string meslek = "öğretm";
    string sehir = "ist";
    
    var data = db.TabloAdi
       .Where( row => String.IsNullOrEmpty( ad ) || row.Ad.StartsWith(ad) )
       .Where( row => String.IsNullOrEmpty( soyad ) || row.Soyad.StartsWith(soyad) )
       .Where( row => String.IsNullOrEmpty( meslek ) || row.Meslek.StartsWith(meslek) )
       .Where( row => String.IsNullOrEmpty( sehir ) || row.Sehir.StartsWith(sehir) );
    Not: data.ToString() ile farkli durumlarda SQL server'a gidecek olan SQL'i gorebilirsin.


    • Düzenleyen CetinBasoz 10 Nisan 2012 Salı 12:04
    • Yanıt Olarak İşaretleyen Oxijen 11 Nisan 2012 Çarşamba 12:25
    10 Nisan 2012 Salı 12:02

Tüm Yanıtlar

  • User Table

    UserName

    UserSurName

    UserCountry

    UserJops

    die bir tablon olsun

    create procedu2re  Sp_Filter

    (

    @UserName nvarchar(50), @UserSurName nvarchar(50),@UserCountry nvarchar(50), @UserJops nvarchar(50)

    )

    as

    Select * from userTAble where UserName like '%' + @UserName +'%' or Userjops like '%'+ @UserJops +'%' or UserCountry like '%' + @UserCountry + '%'

    gibi bir procedure yaratabilirsin mesela

    • Yanıt Olarak Öneren CetinBasoz 10 Nisan 2012 Salı 11:38
    • Yanıt Olarak İşaretleyen Oxijen 11 Nisan 2012 Çarşamba 12:26
    10 Nisan 2012 Salı 10:48
  • User Table

    UserName

    UserSurName

    UserCountry

    UserJops

    die bir tablon olsun

    create procedu2re  Sp_Filter

    (

    @UserName nvarchar(50), @UserSurName nvarchar(50),@UserCountry nvarchar(50), @UserJops nvarchar(50)

    )

    as

    Select * from userTAble where UserName like '%' + @UserName +'%' or Userjops like '%'+ @UserJops +'%' or UserCountry like '%' + @UserCountry + '%'

    gibi bir procedure yaratabilirsin mesela

    Teşekkürler. Yalnız bir sorum daha olacak...

    Yukarıdaki kodu uyguladığımda date alanları için aşağıdaki hatayı alıyorum. Nasıl düzeltebilirim?

    "The data types varchar and date are incompatible in the add operator."

    KOD:

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO

    CREATE PROCEDURE [bayitakip].[sp_Filtre]
     @MusteriAdi as nvarchar(MAX) =' ',
     @Konu as text =' ',
     @SeriNo as nvarchar(MAX) = 0,
     @BildirimTarihi as date = '1900-01-01',
     @MudahaleTarihi as date = '1900-01-01',
     @KapanisTarihi as date = '1900-01-01',
     @UrunSorumlusu as nvarchar(50) =' ',
     @BildirimKaynagi as nvarchar(50) =' ',
     @Durumu as nvarchar(50) =' ',
     @Grup as nvarchar(50) =' ',
     @Modeli as nvarchar(50) =' '
    AS

    BEGIN

    SET NOCOUNT ON
    SET TRANSACTION ISOLATION LEVEL READ COMMITTED

    SELECT [MusteriAdi]
          ,[UrunSorumlusu]
          ,[BildirimTarihi]
          ,[MudahaleTarihi]
          ,[KapanisTarihi]
          ,[Bolge]
          ,[BildirimKaynagi]
          ,[Grup]
          ,[Modeli]
          ,[SeriNo]
          ,[Saati]
          ,[Durumu]
          ,[Durumu2]
          ,[Konu]
          ,[YapilacakIsler]
          ,[Sonuc]
    FROM
     [bayitakip].[ArizaKayitlari]
    WHERE

    MusteriAdi like '%' + @MusteriAdi + '%' or
    UrunSorumlusu like '%'+ @UrunSorumlusu +'%' or
    BildirimTarihi like '%' + @BildirimTarihi + '%' or
    MudahaleTarihi like '%' + @MudahaleTarihi + '%' or
    KapanisTarihi like '%' + @KapanisTarihi + '%' or
    BildirimKaynagi like '%' + @BildirimKaynagi + '%' or
    Grup like '%' + @Grup + '%' or
    Modeli like '%' + @Modeli + '%' or
    SeriNo like '%' + @SeriNo + '%' or
    Durumu like '%' + @Durumu + '%' or
    Konu like '%' + @Konu + '%'

    order by [ID]desc
    END

    10 Nisan 2012 Salı 11:46
  • BKRHBK rumuzlu arkadasin dedigi gibi olabilir ama OR yerine AND kullanman gerekiyor, bir de '%'+...+'%' seklinde degil, ...+'%' seklinde olacak (icinde gecen degil, ile baslayan ariyorsun). Yoksa hem sorgularin daha yavas olur hem de ornegin sadece bir tanesi bos gecilse tum kayitlari alirsin.

    Ben sahsen bunun icin bir SP yaratmazdim. Duruma gore SQL olusturup onu gonderirdim SQL server'a. Mesela, bosuna, girilmemis alani sorgulatmanin anlami yok. Bunu .Net'den yapiyorsan LinqToEF ya da LinqToSQL ile cok basit. Ornek:

    string ad = "e";
    string soyad = "g";
    string meslek = "öğretm";
    string sehir = "ist";
    
    var data = from row in db.TabloAdi
       where 
    ( String.IsNullOrEmpty( ad ) || row.Ad.StartsWith(ad) ) &&
    ( String.IsNullOrEmpty( soyad ) || row.Soyad.StartsWith(soyad) ) &&
    ( String.IsNullOrEmpty( meslek ) || row.Meslek.StartsWith(meslek) ) &&
    ( String.IsNullOrEmpty( sehir ) || row.Sehir.StartsWith(sehir) )
       select row;

    Ya da metod syntaxi ile:

    string ad = "e";
    string soyad = "g";
    string meslek = "öğretm";
    string sehir = "ist";
    
    var data = db.TabloAdi
       .Where( row => String.IsNullOrEmpty( ad ) || row.Ad.StartsWith(ad) )
       .Where( row => String.IsNullOrEmpty( soyad ) || row.Soyad.StartsWith(soyad) )
       .Where( row => String.IsNullOrEmpty( meslek ) || row.Meslek.StartsWith(meslek) )
       .Where( row => String.IsNullOrEmpty( sehir ) || row.Sehir.StartsWith(sehir) );
    Not: data.ToString() ile farkli durumlarda SQL server'a gidecek olan SQL'i gorebilirsin.


    • Düzenleyen CetinBasoz 10 Nisan 2012 Salı 12:04
    • Yanıt Olarak İşaretleyen Oxijen 11 Nisan 2012 Çarşamba 12:25
    10 Nisan 2012 Salı 12:02
  • BKRHBK rumuzlu arkadasin dedigi gibi olabilir ama OR yerine AND kullanman gerekiyor, bir de '%'+...+'%' seklinde degil, ...+'%' seklinde olacak (icinde gecen degil, ile baslayan ariyorsun). Yoksa hem sorgularin daha yavas olur hem de ornegin sadece bir tanesi bos gecilse tum kayitlari alirsin.

    Ben sahsen bunun icin bir SP yaratmazdim. Duruma gore SQL olusturup onu gonderirdim SQL server'a. Mesela, bosuna, girilmemis alani sorgulatmanin anlami yok. Bunu .Net'den yapiyorsan LinqToEF ya da LinqToSQL ile cok basit. Ornek:

    string ad = "e";
    string soyad = "g";
    string meslek = "öğretm";
    string sehir = "ist";
    
    var data = from row in db.TabloAdi
       where 
    ( String.IsNullOrEmpty( ad ) || row.Ad.StartsWith(ad) ) &&
    ( String.IsNullOrEmpty( soyad ) || row.Soyad.StartsWith(soyad) ) &&
    ( String.IsNullOrEmpty( meslek ) || row.Meslek.StartsWith(meslek) ) &&
    ( String.IsNullOrEmpty( sehir ) || row.Sehir.StartsWith(sehir) )
       select row;

    Ya da metod syntaxi ile:

    string ad = "e";
    string soyad = "g";
    string meslek = "öğretm";
    string sehir = "ist";
    
    var data = db.TabloAdi
       .Where( row => String.IsNullOrEmpty( ad ) || row.Ad.StartsWith(ad) )
       .Where( row => String.IsNullOrEmpty( soyad ) || row.Soyad.StartsWith(soyad) )
       .Where( row => String.IsNullOrEmpty( meslek ) || row.Meslek.StartsWith(meslek) )
       .Where( row => String.IsNullOrEmpty( sehir ) || row.Sehir.StartsWith(sehir) );
    Not: data.ToString() ile farkli durumlarda SQL server'a gidecek olan SQL'i gorebilirsin.


    @CetinBasoz;

    Büyük verilerde sorguyu sql tarafında halledip filtrelenmiş veriyi forma dönmek daha doğru diye düşündüğümden stored prosedure olarak yapmak istedim, hem de biraz sql öğrenmek adına...

    10 Nisan 2012 Salı 12:09
  • Iyi de burada dediginden farkli birsey yapmiyorsun ki. Linq ile yazilan bir IQueryable. Daha server'a giden birsey yok. Hatta o data'ya yeni clause ekleyebilirsin, degisken gibi bir metoddan alabilirsin vs. Farkli olan sadece SP yerine dynamic TSQL kullaniyorsun ve TSQL yerine bildigin .Net dili yetiyor. Illa tSQL ile yazicam diye kasmanin anlami yok. Linq versiyonunun bir baska avantaji da, kodunu degistirmeden MS SQL server disindaki bir veri tabani ile de kullanabilmen. Tabii hep ne derler "yine de sen bilirsin":)

    Not: Bu arada Linq versiyonunda o dedigin date derdi yok. string, date, numeric vs ne gerekiyorsa arada suruculer senin icin cevirimi yapiyor.

    • Düzenleyen CetinBasoz 10 Nisan 2012 Salı 12:28
    10 Nisan 2012 Salı 12:26
  • Teşekkürler. Linq ile deneyeceğim...
    10 Nisan 2012 Salı 13:15
  • "

    string ad = "e";
    string soyad = "g";
    string meslek = "öğretm";
    string sehir = "ist";

    var data = from row in db.TabloAdi
      
    where
    ( String.IsNullOrEmpty( ad ) || row.Ad.StartsWith(ad) ) &&
    ( String.IsNullOrEmpty( soyad ) || row.Soyad.StartsWith(soyad) ) &&
    ( String.IsNullOrEmpty( meslek ) || row.Meslek.StartsWith(meslek) ) &&
    ( String.IsNullOrEmpty( sehir ) || row.Sehir.StartsWith(sehir) )
      
    select row;

    "

    kullanımı çok ilginç olmuş, teşekkürler


    Mustafa Torun

    10 Nisan 2012 Salı 18:02
  • Linq'te filtre için Tarih alanlarında aşağıdaki gibi kod yazdım:

    (dpBildirimTarihiFiltre.SelectedDate.HasValue || row.BildirimTarihi.Value == dpBildirimTarihiFiltre.SelectedDate.Value)

    Tarih için olan kodu çıkartınca yukarıdaki linq örneğindeki gibi yaptığım filtre çalışıyor. Ancak bu kodu ekleyince filtre çalışmamaya başlıyor. Tarih alanları için nasıl bir düzenleme yapmalıyım?

    11 Nisan 2012 Çarşamba 12:24
  • Linq'te filtre için Tarih alanlarında aşağıdaki gibi kod yazdım:

    (dpBildirimTarihiFiltre.SelectedDate.HasValue || row.BildirimTarihi.Value == dpBildirimTarihiFiltre.SelectedDate.Value)

    Tarih için olan kodu çıkartınca yukarıdaki linq örneğindeki gibi yaptığım filtre çalışıyor. Ancak bu kodu ekleyince filtre çalışmamaya başlıyor. Tarih alanları için nasıl bir düzenleme yapmalıyım?

    Kendi sorumu cevaplayayım, benimde bir katkım olsun:

    (!dpBildirimTarihiFiltre.SelectedDate.HasValue || row.BildirimTarihi.Value == dpBildirimTarihiFiltre.SelectedDate.Value)

    dpBildirimTarihiFiltre.SelectedDate.HasValue başına ! koyarak filtre sorunsuz hale geldi.

    Teşekkürler.

    11 Nisan 2012 Çarşamba 13:22
  • Benim hatam. Tarih kolay derken onun icin ornek vermeyi unuttum. Bu sekilde kullanirsan sorun cikar. Soyle kullan:

    DateTime? bildirimTarihi = dpBildirimTarihiFiltre.SelectedDate;
    
    // ...
    (bildirimTarihi == null || row.BildirimTarihi == bildirimTarihi)

    11 Nisan 2012 Çarşamba 13:51