En iyi yanıtlayıcılar
SQL'de Filtre Yazmak?

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.
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
-
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
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
-
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
GOCREATE 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) =' '
ASBEGIN
SET NOCOUNT ON
SET TRANSACTION ISOLATION LEVEL READ COMMITTEDSELECT [MusteriAdi]
,[UrunSorumlusu]
,[BildirimTarihi]
,[MudahaleTarihi]
,[KapanisTarihi]
,[Bolge]
,[BildirimKaynagi]
,[Grup]
,[Modeli]
,[SeriNo]
,[Saati]
,[Durumu]
,[Durumu2]
,[Konu]
,[YapilacakIsler]
,[Sonuc]
FROM
[bayitakip].[ArizaKayitlari]
WHEREMusteriAdi 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 -
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
-
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.
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...
-
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
-
-
"
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
-
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?
-
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.
-