none
Bir SQL Parametresiyle Birden Çok Değer Arattırma RRS feed

  • Soru

  • Bir SQL Query İçerisinde

    @Kriter nvarchar(50); diye bir parametre var. Bu parametreye form tarafından X değeri geldiğini varsayalım

    gelen değer x olunca WHERE koşulu içerisinde A kolonunda değeri H veya B veya C ye benzeyen kayıtları getirecek.

    Aynı şekilde @Kriter Y değeri aldıysa da yine WHERE cümleciğinde A kolonun değeri F veya G veya H olan değerleri getirecek.

    Bunu nasıl yapabilirim?

    30 Nisan 2015 Perşembe 12:55

Yanıtlar

  • select ...
    WHERE Case 
          when @Kriter = X then (A like H or A like B or A like C)
          when @Kriter = Y then (A like H or A like F or A like G)
          end;
    Not: Hiz derdinin olmadigini dusunursek boyle. Yoksa fulltext search yapmak isteyebilirsin.
    • Yanıt Olarak İşaretleyen HasanYaman 30 Nisan 2015 Perşembe 14:09
    30 Nisan 2015 Perşembe 13:18

Tüm Yanıtlar

  • select ...
    WHERE Case 
          when @Kriter = X then (A like H or A like B or A like C)
          when @Kriter = Y then (A like H or A like F or A like G)
          end;
    Not: Hiz derdinin olmadigini dusunursek boyle. Yoksa fulltext search yapmak isteyebilirsin.
    • Yanıt Olarak İşaretleyen HasanYaman 30 Nisan 2015 Perşembe 14:09
    30 Nisan 2015 Perşembe 13:18
  • Hocam 210 milyon kayıt var,dolayısıyla hız derdim de var.

    Şimdi bir şey deniyorum. Şöyle:

    Form tarafında yüklenecek değere göre string bir dizi oluşturucam. Daha sonra bunu komalarla bölerek düz bir string elde edicem. Sonra bu elde ettiğim değeri veritabanına paslayıp

    daha önce ID için yazmış olduğum bir Query vardı XML ile bunu char olan versiyonunu deniycem SELECT için.

    ALTER PROCEDURE [dbo].[2011Pasif]
    (
    @IDS nvarchar(max)
    )
    
    AS BEGIN
    DECLARE @Pasif nvarchar(10)=N'Pasif' COLLATE TURKISH_CI_AS;
    DECLARE @XParam XML;
    SELECT @XParam = CAST('<i>' + REPLACE(@IDS,',','</i><i>') + '</i>' AS XML);
    UPDATE Arsiv_EskiVeriler SET Gorunurluk=@Pasif,AktifPasif=@Pasif WHERE KayitNo IN (SELECT x.i.value('.','INT') FROM @XParam.nodes('//i') x(i));

    Hem sizin yönteminizi hemde kendi yöntemimi bir deniycem. Sonucu sizinle paylaşırım.

    Ama bahsetmiş olduğunuz yöntemle SQL tarafında çok CASE WHEN yazarım. Tabi perfomans daha önemli.

    • Yanıt Olarak İşaretleyen HasanYaman 30 Nisan 2015 Perşembe 14:09
    • Yanıt İşaretini Geri Alan HasanYaman 30 Nisan 2015 Perşembe 14:09
    30 Nisan 2015 Perşembe 13:58
  • Aslında şimdi düşündüm de sizin ki daha az kod benimki amelelilk. Her koşul için farklı list hazırlıycam form tarafında yada aynı listi doldur boşalt yapıcam birde XML giriyor işin içine.

    Sağolun.

    30 Nisan 2015 Perşembe 14:09
  • Tam anlayamadim ama senin kodundan anladigim bir dizi integer ID'yi xml olarak onlarin kayitlarini istiyorsun gibi geldi. Eger oyleyse XML'den bu ID'leri parse etmesi yavas bir islem (XML'in boyunun gereksiz yere olabileceginden cok daha fazla olmasi da cabasi). Ben bunun yerine duz virgulle ayrilmis liste gonderiyorum, bir tane C#'ta yazdigim parser function var o table'a parse edip join ediyor SQL server tarafinda. Son zamanlarda degisik yaklasimlari zamanladim da, XML yaklasimi en yavasi idi (20000 ID ile deneyemiyorsun bile - timeout'u arttirmadan).
    • Düzenleyen CetinBasoz 30 Nisan 2015 Perşembe 15:37
    30 Nisan 2015 Perşembe 15:37
  • Hocam kusura bakmayın araya 1 mayıs girdi cevap veremedim :)

    Sizin kullanımınızı şimdi denedim ama THEN kullanımında bir hata var. THEN kendinden sonra doğrudan bir değer istiyor. Karşılaştırma operatörünü kabul etmiyor.

    Yani

    THEN (A LIKE @Param1 OR A LIKE @Param2)

    den ziyade

    THEN x.dbo.y 
    THEN Value
    gibi bir şey istiyor.

    2 Mayıs 2015 Cumartesi 16:33
  • Bir Split Function buldum

    USE [ParsDatabase]
    GO
    /****** Object:  UserDefinedFunction [dbo].[Split]    Script Date: 02.05.2015 22:26:07 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER FUNCTION [dbo].[Split](@String varchar(8000), @Delimiter char(1))
    returns @temptable TABLE (items varchar(8000))
    as
    begin
            declare @idx int
            declare @slice varchar(8000)
        
            select @idx = 1
                    if len(@String)<1 or @String is null  return
        
            while @idx!= 0
            begin
                    set @idx = charindex(@Delimiter,@String)
                    if @idx!=0
                            set @slice = left(@String,@idx - 1)
                    else
                            set @slice = @String
                    
                    if(len(@slice)>0)
                            insert into @temptable(items) values(@slice)
    
                    set @String = right(@String,len(@String) - @idx)
                    if len(@String) = 0 break
            end
    return
    end

    Kullanımıda şöyle

    WHERE Column IN (SELECT items from dbo.Split(@Parameter,','));

    Bu haliyle form tarafında combobox'ın selectedindexchanged eventinde seçilen iteme göre listler  tanımlıyorum, comma seperate ederek string yapıp parametreyi procedure gönderiyorum.

    XML kullanmak zorunda da kalmadım. WHERE IN in performansıda çok iyi bu arada.

    Sizin CASE WHEN THEN kullanımı da dediğim gibi hocam THEN den sonra sadece VALUE alıyor kıyaslama operatörlerini kabul etmiyor.

    2 Mayıs 2015 Cumartesi 19:35