none
Sql çoklu kriterlendirme RRS feed

  • 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.

    28 Eylül 2015 Pazartesi 07:07

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
    28 Eylül 2015 Pazartesi 11:41
  • 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
    28 Eylül 2015 Pazartesi 11:43
  • 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
    28 Eylül 2015 Pazartesi 11:44

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
    28 Eylül 2015 Pazartesi 11:41
  • 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
    28 Eylül 2015 Pazartesi 11:43
  • 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
    28 Eylül 2015 Pazartesi 11:44
  • İf else kullanarak birşeyler yapmıştım.Ama uzun olmuştu.Çetin hocam çok çok Teşekkür ederim.
    28 Eylül 2015 Pazartesi 12:16