Soran
select sorgusunda değişken sorunu

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
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. -
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ı?
-
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. -
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 :)
-
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 :)
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.