En iyi yanıtlayıcılar
Sql çoklu kriterlendirme

Soru
-
Merhaba ,
Ben SQL 'de filtreleme yapıcam.Fakat bir sıkıntım var.Çoklu kriterim var.Örnek vermek gerekirse.
Select * from Table Where
Column1 = @param1
or
Column2 = @param2
or
Column3 = @param3
or
Column4 = @param4
Burda Mantık olarak kriterlerden biri karşılandığında diğerlerine bakmıyor.And Koyarsam kriterlerin hepsi karşılanması gerekiyor.Benim yapmak istediğim kriter1 varsa 1'i, kriter1 ve kriter2 varsa kriter1 ve kriter2 'yi , kriter1 ve kriter2 ve kriter3 varsa kriter1,kriter2,kriter3 'ü getir vs.. vs..
Bunu nasıl yapabilirim ? Teşekkürler.
Yanıtlar
-
KadirGuler,
Soruyu SQL server forumunda sormussunuz, ancak bildigim kadariyle C# kullaniyorsunuz. Sahsi fikrim, bu sorunun en efektif cozumu, Linq ile. SQL server forumunda sordugunuz icin once aklima gelen T-SQL cozum ve arkasindan 2 tane C# ile cozum vereyim siz secin.
T-SQL ile:
SELECT * FROM TabloAdi WHERE ( @param1 IS NULL OR Column1 = @param1 ) AND ( @param2 IS NULL OR Column2 = @param2 ) AND ( @param3 IS NULL OR Column3 = @param3 ) AND ( @param4 IS NULL OR Column4 = @param4 );
(cozumler tek mesajda karmasik hale geliyor, onun icin her birisini ayri mesajda veriyorum...)
- Yanıt Olarak İşaretleyen KadirGuler 28 Eylül 2015 Pazartesi 12:13
-
Bu ikinci cozum C# ile, Linq kullanmadan if serisiyle T-SQL CommandText ayarlamak seklinde (Northwind databaseinden ornek):
void Main() { Bul("BONAP", 8).Dump("customer, emp"); Bul("BONAP", null).Dump("customer"); Bul(null, 8).Dump("emp"); Bul(null, null).Dump(); } private DataTable Bul(string customerId, int? empId) { DataTable tbl = new DataTable(); using(SqlConnection con = new SqlConnection(@"server=.\SQLExpress;Database=Northwind;Trusted_Connection=yes")) { SqlCommand cmd = new SqlCommand(); string sql = "select * from Orders"; List<string> clauses = new List<string>(); if (customerId != null) { clauses.Add( "customerID = @customerId" ); cmd.Parameters.AddWithValue("@customerId",customerId); } if (empId != null) { clauses.Add( "employeeID = @empId" ); cmd.Parameters.AddWithValue("@empId",empId); } if (clauses.Count () > 0) { sql += " where " + string.Join(" and ", clauses); } cmd.CommandText = sql; cmd.Connection = con; con.Open(); tbl.Load( cmd.ExecuteReader() ); con.Close(); } return tbl; }
- Yanıt Olarak İşaretleyen KadirGuler 28 Eylül 2015 Pazartesi 12:13
-
Benim en etkili buldugum cozum Linq ile. Linq cok akilli davraniyor ve sadece verilen parametreler icin SQL insa edip gonderiyor SQL server'a:
void Main() { string country = "USA"; //"Brazil" string city = ""; //"Sao Paulo" DateTime? orderDate = null; //new DateTime(1996,8,28); var data = Orders .Where (c => string.IsNullOrEmpty(country) || c.ShipCountry.StartsWith(country) ) .Where (c => string.IsNullOrEmpty(city) || c.ShipCity.StartsWith(city) ) .Where (c => orderDate == null || c.OrderDate == orderDate) .Select (c => new Order { OrderId = c.OrderID, CustomerId = c.CustomerID, OrderDate = c.OrderDate, ShipCountry=c.ShipCountry, ShipCity=c.ShipCity }); Form f = new Form { Text="Sorgu Sonuclari"}; DataGridView dgv = new DataGridView { Dock=DockStyle.Fill}; f.Controls.Add( dgv ); dgv.DataSource = data.ToList(); f.ShowDialog(); } public class Order { public int OrderId { get; set; } public DateTime? OrderDate { get; set; } public string CustomerId { get; set; } public string ShipCountry { get; set; } public string ShipCity { get; set; } }
- Yanıt Olarak İşaretleyen KadirGuler 28 Eylül 2015 Pazartesi 12:13
Tüm Yanıtlar
-
KadirGuler,
Soruyu SQL server forumunda sormussunuz, ancak bildigim kadariyle C# kullaniyorsunuz. Sahsi fikrim, bu sorunun en efektif cozumu, Linq ile. SQL server forumunda sordugunuz icin once aklima gelen T-SQL cozum ve arkasindan 2 tane C# ile cozum vereyim siz secin.
T-SQL ile:
SELECT * FROM TabloAdi WHERE ( @param1 IS NULL OR Column1 = @param1 ) AND ( @param2 IS NULL OR Column2 = @param2 ) AND ( @param3 IS NULL OR Column3 = @param3 ) AND ( @param4 IS NULL OR Column4 = @param4 );
(cozumler tek mesajda karmasik hale geliyor, onun icin her birisini ayri mesajda veriyorum...)
- Yanıt Olarak İşaretleyen KadirGuler 28 Eylül 2015 Pazartesi 12:13
-
Bu ikinci cozum C# ile, Linq kullanmadan if serisiyle T-SQL CommandText ayarlamak seklinde (Northwind databaseinden ornek):
void Main() { Bul("BONAP", 8).Dump("customer, emp"); Bul("BONAP", null).Dump("customer"); Bul(null, 8).Dump("emp"); Bul(null, null).Dump(); } private DataTable Bul(string customerId, int? empId) { DataTable tbl = new DataTable(); using(SqlConnection con = new SqlConnection(@"server=.\SQLExpress;Database=Northwind;Trusted_Connection=yes")) { SqlCommand cmd = new SqlCommand(); string sql = "select * from Orders"; List<string> clauses = new List<string>(); if (customerId != null) { clauses.Add( "customerID = @customerId" ); cmd.Parameters.AddWithValue("@customerId",customerId); } if (empId != null) { clauses.Add( "employeeID = @empId" ); cmd.Parameters.AddWithValue("@empId",empId); } if (clauses.Count () > 0) { sql += " where " + string.Join(" and ", clauses); } cmd.CommandText = sql; cmd.Connection = con; con.Open(); tbl.Load( cmd.ExecuteReader() ); con.Close(); } return tbl; }
- Yanıt Olarak İşaretleyen KadirGuler 28 Eylül 2015 Pazartesi 12:13
-
Benim en etkili buldugum cozum Linq ile. Linq cok akilli davraniyor ve sadece verilen parametreler icin SQL insa edip gonderiyor SQL server'a:
void Main() { string country = "USA"; //"Brazil" string city = ""; //"Sao Paulo" DateTime? orderDate = null; //new DateTime(1996,8,28); var data = Orders .Where (c => string.IsNullOrEmpty(country) || c.ShipCountry.StartsWith(country) ) .Where (c => string.IsNullOrEmpty(city) || c.ShipCity.StartsWith(city) ) .Where (c => orderDate == null || c.OrderDate == orderDate) .Select (c => new Order { OrderId = c.OrderID, CustomerId = c.CustomerID, OrderDate = c.OrderDate, ShipCountry=c.ShipCountry, ShipCity=c.ShipCity }); Form f = new Form { Text="Sorgu Sonuclari"}; DataGridView dgv = new DataGridView { Dock=DockStyle.Fill}; f.Controls.Add( dgv ); dgv.DataSource = data.ToList(); f.ShowDialog(); } public class Order { public int OrderId { get; set; } public DateTime? OrderDate { get; set; } public string CustomerId { get; set; } public string ShipCountry { get; set; } public string ShipCity { get; set; } }
- Yanıt Olarak İşaretleyen KadirGuler 28 Eylül 2015 Pazartesi 12:13
-