none
select sorgusunda değişken sorunu RRS feed

  • Soru

  • Merhaba,

    aşağıdaki iki sorguda çıkan sonuçlar farklı, neden olabilir? test yaparak sorunun where'den sonraki ('Mola'+cast (@sayac as nvarchar) değişken tanımlamasında olduğunu buldum. ama sorunu nasıl çözerim bulamadım.

    Tablo :

    Mola1 nvarchar, değer var

    Mola2 nvarchar, değer yok

    sicil int değer tanımı 11111

    sorgu 1:

    Select COUNT(Mola2) from Modul where Sicil=11111 and Mola2 is not null

    sorgu sonucu 0 olarak çıkıyor

    sorgu 2:

    declare @sayac int;
    set @sayac=2
    select count('Mola'+cast (@sayac as nvarchar)) from Modul where (('Mola'+cast (@sayac as nvarchar) is not null) and Sicil=11111)

    sorgu sonucu 1 olarak çıkıyor

    23 Ekim 2019 Çarşamba 18:09

Tüm Yanıtlar

  • Tablolarini kod seklinde vermediğinden, aslında ne oldukları belirsiz. 

    Iki sorgu birbirinden tamamen farklı. Yanlış anlamadıysam Mola1, Mola2, sicil alan adları. Deger var, deger yok ne demek onu pek anlamadım, "deger yok" NULL anlamında mi?

    declare @Modul Table (Mola1 nvarchar(10) NULL, Mola2 nvarchar(10) NULL, sicil int NOT NULL);
    
    insert into @Modul (Mola1, sicil) values (N'blahBlah',1111);
    
    select * from @Modul;

    Eger tablo bu sekildeyse:

    Ilk sorguya uyan, Sicil=1111, Mola2 is not null kayıt yok zaten, sonuc 0.

    Ikinci sorguda ise tamamen farklı bir şey sorguluyorsunuz:

    where (('Mola'+cast (@sayac as nvarchar) is not null) and Sicil=11111)
    


    burada:

    (('Mola'+cast (@sayac as nvarchar) is not null)
    

    daima TRUE, çünkü sayac NULL degil ve sonuc 'Mola2'. Bu ifade NULL degil. Geriye sadece sicil=1111 kalıyor ki, sonuçta sorgu aslinda:

    select count('Mola2') from Modul where Sicil=11111
    
    -- ya da
    select count(*) from Modul where Sicil=11111
    
    -- ya da 
    select count(1) from Modul where Sicil=11111
    
    

    yazmakla ayni şey ve sonuc 1 doğru.



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    23 Ekim 2019 Çarşamba 18:45
  • tablom aşağıdaki şekilde;

    Mola1 Mola2 Mola3 Mola4 Sicil ToplamMola
    12 NULL 3 NULL 1111 2
    4 2 NULL 7 2222 3

    yapmak istediğim şeyi yazarsam aslında doğru yol konusunda yardımcı olabilirseniz sevinirim.

    • tablo içerisinde kaç tane mola kolonu varsa (örnekte 4) bunu saysın. aşağıdaki şekilde sayıyı elde ettim.


    select COUNT (COLUMN_NAME)  from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='Modul' and RTRIM (COLUMN_NAME) LIKE 'Mola%'

    • Arayüzden girilen sicil numarasına göre ToplamMola alanına Mola1-2-3-4.. de dolu sayısını yazacak. örneğin, 1111 sicil numarası için 2 , 2222 sicil için sorgulama yapıldığında 3 yazacak.

    yapamadığım yer yukarıda değişkenli olan kısımda boş veya dolu hücre sayısını bulma.

    bunu nasıl yapabilirim? farklı bir yol öneriniz varmıydı?

    23 Ekim 2019 Çarşamba 19:11
  • Ya daha ilk cevabımda "tablolarını kod seklinde vermediginden ..." demistim :( Yine kod seklinde degil ve anlamak icin ızdırap çekmekteyiz gerekiyor.

    Oncelikle sunu belirteyim, berbat bir tablo tasarımı. SQL serisi veritabanları set bazlı calisir. 

    Asagidaki iki sorguyla da olur, ikincisi aslında daha uzun görünse de normalde olmasi gereken tablo yapisini gosterdiginden onemli:

    select Mola1, Mola2, Mola3, Mola4, Sicil,
        case when Mola1 is null then 0 else 1 end +
        case when Mola2 is null then 0 else 1 end +
        case when Mola3 is null then 0 else 1 end +
        case when Mola4 is null then 0 else 1 end as ToplamMola 
    from Modul;
        
    select m.Mola1, m.Mola2, m.Mola3, m.Mola4, m.Sicil, g.ToplamMola
    from modul m
    inner join
    (select sicil, count(Mola) as ToplamMola
    from
    (
    select Mola1 as Mola, sicil from Modul
    union all
    select Mola2 as Mola, sicil from Modul 
    union all
    select Mola3 as Mola, sicil from Modul
    union all
    select Mola4 as Mola, sicil from Modul) tmp
    group by sicil) g 
    on m.sicil = g.sicil;

     


    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    23 Ekim 2019 Çarşamba 20:40
  • Merhaba, 

    Desteğiniz için teşekkür ederim. istediğim sonuçları gönderdiğiniz koda bir kaç ufak ekleme ile elde ettim.

    "Oncelikle sunu belirteyim, berbat bir tablo tasarımı. SQL serisi veritabanları set bazlı calisir. " yorumunuz için doğru söylüyor olabilirsiniz :) sonuçta internetten araştırarak, parça kodlara bakarak bir şeyler yapmaya çalışıyorum.  örneğin set bazlı çalışır ile neyi kast ettiğinizi anlamadım ama araştırıcam :)

    24 Ekim 2019 Perşembe 18:31
  • Merhaba, 

    Desteğiniz için teşekkür ederim. istediğim sonuçları gönderdiğiniz koda bir kaç ufak ekleme ile elde ettim.

    "Oncelikle sunu belirteyim, berbat bir tablo tasarımı. SQL serisi veritabanları set bazlı calisir. " yorumunuz için doğru söylüyor olabilirsiniz :) sonuçta internetten araştırarak, parça kodlara bakarak bir şeyler yapmaya çalışıyorum.  örneğin set bazlı çalışır ile neyi kast ettiğinizi anlamadım ama araştırıcam :)

    Mola 4 tane degil de, 100-150 tane olsaydi ne yapardınız? Onu düşünürseniz cevabini bulacaksınız.


    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    26 Ekim 2019 Cumartesi 20:10