Her iki alanda dolu veya boşsa listeleme
Her iki alanda dolu veya boşsa listeleme
Merhaba arkadaşlar,
Sql sorgulamada biryerde takıldı.. Yardımcı olabilirmisiniz?
Sql alanlarım şöyle; Tablo adı : GIRIS
ADISOYADI - TELEFON - ISEGIRISTARIH - ISTENCIKISTARIH - NOT1 - NOT2
Ben şunu demek istiyorum. NOT1 ve NOT2 alanları dolu olan tüm kayıtları listele.
Ben şöyle yaptım, listeliyor ama her iki alan da doluysa.. herhanigibiri boş sa listelemiyor.
select * from GIRIS where (ISEGIRISTARIH >= '2014-07-01 00:00:00') and (ISTENCIKISTARIH <= '2014-12-01 00:00:00') and (NOT1 IS NOT NULL) and (NOT2 IS NOT NULL)
Ben bu şekilde yaptığımda ; NOT1 ve NOT2 alanları her ikisinde de doluysa listeliyor. ama ben bir kayıtın NOT1 alanı doluyken diğer kayıtın NOT2 alanı dolu olanlarıda listelemek istiyorum.
Ne yapmam gerek?
Sql sorgulamada biryerde takıldı.. Yardımcı olabilirmisiniz?
Sql alanlarım şöyle; Tablo adı : GIRIS
ADISOYADI - TELEFON - ISEGIRISTARIH - ISTENCIKISTARIH - NOT1 - NOT2
Ben şunu demek istiyorum. NOT1 ve NOT2 alanları dolu olan tüm kayıtları listele.
Ben şöyle yaptım, listeliyor ama her iki alan da doluysa.. herhanigibiri boş sa listelemiyor.
select * from GIRIS where (ISEGIRISTARIH >= '2014-07-01 00:00:00') and (ISTENCIKISTARIH <= '2014-12-01 00:00:00') and (NOT1 IS NOT NULL) and (NOT2 IS NOT NULL)
Ben bu şekilde yaptığımda ; NOT1 ve NOT2 alanları her ikisinde de doluysa listeliyor. ama ben bir kayıtın NOT1 alanı doluyken diğer kayıtın NOT2 alanı dolu olanlarıda listelemek istiyorum.
Ne yapmam gerek?
Re: Her iki alanda dolu veya boşsa listeleme
Soruyu sorarken kullandığınız kelimelere göre yapılan işlem doğru ama soruyu yanlış sormuşsunuz:
"NOT1 ve NOT2 alanları dolu olan tüm kayıtları listele" demişsiniz. Ama anlaşılan yapmak istediğiniz: "NOT1 veya NOT2 alanları dolu olan tüm kayıtları listele"
Dolayısıyla sorguda kullandığınız AND yerine OR kullanmalısınız:
"NOT1 ve NOT2 alanları dolu olan tüm kayıtları listele" demişsiniz. Ama anlaşılan yapmak istediğiniz: "NOT1 veya NOT2 alanları dolu olan tüm kayıtları listele"
Dolayısıyla sorguda kullandığınız AND yerine OR kullanmalısınız:
Kod: Tümünü seç
select * from GIRIS where (ISEGIRISTARIH >= '2014-07-01 00:00:00') and (ISTENCIKISTARIH <= '2014-12-01 00:00:00') and ( (NOT1 IS NOT NULL) or (NOT2 IS NOT NULL) )
There's no place like 127.0.0.1
Re: Her iki alanda dolu veya boşsa listeleme
Yok.. OR ile de denemiştim.
Yapmak istediğim şu.
ADISOYADI - TELEFON - ISEGIRISTARIH - ISTENCIKISTARIH - NOT1 - NOT2
ALİ DUM-------0123 ----- 01.08.2014 ------ 05.09.2014 ------ ABC--- NULL
VELİ TAŞ----- 0222- ------ 06.09.2014------ 30.09.2014-------ABC---- ABC
OSMAN ------11111------ 06.09.2014-------30.09.2014 --------ABC------ ABC
AYŞE ----- 0000 --------20.07.2014 -------30.08.2014---------NULL -----ABC
benim yaptığım sorguda VELİ TAŞ ve OSMAN kayıtlarını listeliyor. diğerleri gelmiyor. Çünkü her ikisinde de NOT1 ve NOT2 alanları dolu.. Aslında ben Hepsinin gelmesini istiyorum..
Yapmak istediğim şu.
ADISOYADI - TELEFON - ISEGIRISTARIH - ISTENCIKISTARIH - NOT1 - NOT2
ALİ DUM-------0123 ----- 01.08.2014 ------ 05.09.2014 ------ ABC--- NULL
VELİ TAŞ----- 0222- ------ 06.09.2014------ 30.09.2014-------ABC---- ABC
OSMAN ------11111------ 06.09.2014-------30.09.2014 --------ABC------ ABC
AYŞE ----- 0000 --------20.07.2014 -------30.08.2014---------NULL -----ABC
benim yaptığım sorguda VELİ TAŞ ve OSMAN kayıtlarını listeliyor. diğerleri gelmiyor. Çünkü her ikisinde de NOT1 ve NOT2 alanları dolu.. Aslında ben Hepsinin gelmesini istiyorum..
Re: Her iki alanda dolu veya boşsa listeleme
denerken yanlış birşeyler yapmış olabilirsiniz, en azından yaptığınızı paylaşsanız ona göre cevaplar alırsınız, SimaWB nin gönderdiği sqli denediniz mi?
bazen yükselmek için önce dibi görmek gerekir...
forumda soru sormadan önce bakılmalı bence
daha fazlası için...
yürümeyi öğrenmeden koşmaya çalışanlar için, tökezleyip düşmek kaçınılmazdır...
forumda soru sormadan önce bakılmalı bence
daha fazlası için...
yürümeyi öğrenmeden koşmaya çalışanlar için, tökezleyip düşmek kaçınılmazdır...
Re: Her iki alanda dolu veya boşsa listeleme
evet.. o şekilde yaptım zaten olmadı. Kullanıdığım kodda bu.
select * from GIRIS where (ISEGIRISTARIH >= '2014-07-01 00:00:00') and (ISTENCIKISTARIH <= '2014-12-01 00:00:00') and ( (NOT1 IS NOT NULL) or (NOT2 IS NOT NULL) )
select * from GIRIS where (ISEGIRISTARIH >= '2014-07-01 00:00:00') and (ISTENCIKISTARIH <= '2014-12-01 00:00:00') and ( (NOT1 IS NOT NULL) or (NOT2 IS NOT NULL) )
- sabanakman
- Kıdemli Üye
- Mesajlar: 3077
- Kayıt: 17 Nis 2006 08:11
- Konum: Ah bi Antalya olaydı keşke (Ankara)
Re: Her iki alanda dolu veya boşsa listeleme
Eğer and ve or operatörlerini parantezler ile işlem önceliğini belirtmezseniz önce and operatörleri daha sonra or operatörleri çalışacaktır. Mesajda yazdığınız sorgu sorduğunuz soruya cevap olacak sorgudur.
Konuya matematiksel basit bir örnek vermek gerekirse..:
4 * 5 * 2 + 1 = 41
4 * 5 *(2 +1) =60
şeklinde farklı sonuçlar gelecektir.
Fakat aşağıdaki şekilde parantez vermeden sorgularsanız (or operatörüne giren şartlardaki dış parantezlerde ki farka dikkat!)cmkare yazdı:select * from GIRIS where (ISEGIRISTARIH >= '2014-07-01 00:00:00') and (ISTENCIKISTARIH <= '2014-12-01 00:00:00') and ( (NOT1 IS NOT NULL) or (NOT2 IS NOT NULL) )
aynı gibi görünen ama çok başka şekilde çalışan sorgu olacaktır. Bu ikinci sorgu ise en başta istediğiniz cevaptan çok uzak bir sorgudur. O yüzden "ne sorgu yazdınız", "ne sonuç geldi", "alınmak istenilen sonuç nedir" tam olarak açıkça ifade ederseniz sonuç alabilirsiniz.cmkare yazdı:select * from GIRIS where (ISEGIRISTARIH >= '2014-07-01 00:00:00') and (ISTENCIKISTARIH <= '2014-12-01 00:00:00') and (NOT1 IS NOT NULL) or (NOT2 IS NOT NULL)
/*burada şart sağlanırken or operatöründen önce iki adet and operatörünü soldan sağa bitirdikten sonra en son elde ettiği sonucu or ile son şartla kıyaslar*/
Konuya matematiksel basit bir örnek vermek gerekirse..:
4 * 5 * 2 + 1 = 41
4 * 5 *(2 +1) =60
şeklinde farklı sonuçlar gelecektir.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
Re: Her iki alanda dolu veya boşsa listeleme
Aslında çözüm çok basit. Siz Not1 ve Not2 alanları dolu olduğunda da boş olduğunda da o kaydın görüntülenmesini istiyorsunuz. Yazdıklarınızdan ve verdiğiniz örnekten anladığım bu şekilde. Bu durumda; neden Not1 ve Not2 alanlarını where condition'a koyuyorsunuz Madem bu iki alanın her durumunda bir kısıt oluşmayacak o zaman where kısmına koymanın da bir anlamı yok. Yapılan şeyin anlamsızlığını göstermek için aşağıdaki pseudo code'a bakabilirsiniz:
Tabii bu durumda, Not1 ve Not2 alanları boş olan kayıtlar da listelenecektir. Sizin istediğiniz;
gibi bir SQL cümlesi kullanabilirsiniz. (Tabii siz burada X gibi kullanılması oldukça yüksek bariz bir string sabit yerine kullanılma ihtimali çok daha az olan bir non-printable karakter yada pek sık kullanılmayan tilde(Alt+126 = ~) kullanabilirsiniz.)
Kod: Tümünü seç
SELECT *
FROM Tablo
WHERE
.. AND
.. AND
ISNULL(Not1, 'X') = ISNULL(Not1, 'X') AND
ISNULL(Not2, 'Y') = ISNULL(Not2, 'Y')
- Not1 dolu olabilir Not2 boş olabilir -> Listelensin
Not1 dolu olabilir Not2 dolu olabilir-> Listelensin
Not1 boş olabilir Not2 dolu olabilir -> Listelensin
Kod: Tümünü seç
SELECT *
FROM Tablo
WHERE
.. AND
.. AND
ISNULL(Not1, 'X') + ISNULL(Not2, 'X') <> 'XX'
Re: Her iki alanda dolu veya boşsa listeleme
Teşekkürler. Tuğrul Bey'in söylediği gibi yaptım oldu. Yalnız birşey soracağım, bilmiyorum kusura bakmayın.
ISNULL(Not1, 'X') X veya dediğiniz gibi başka karakter kullanmamın nedeni nedir? yani ne işlevi görüyor.
ISNULL(Not1, 'X') X veya dediğiniz gibi başka karakter kullanmamın nedeni nedir? yani ne işlevi görüyor.