Her iki alanda dolu veya boşsa listeleme

MS SQL Server veritabanı ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
cmkare
Üye
Mesajlar: 177
Kayıt: 23 Ağu 2010 11:29

Her iki alanda dolu veya boşsa listeleme

Mesaj gönderen cmkare »

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?
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: Her iki alanda dolu veya boşsa listeleme

Mesaj gönderen SimaWB »

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:

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
cmkare
Üye
Mesajlar: 177
Kayıt: 23 Ağu 2010 11:29

Re: Her iki alanda dolu veya boşsa listeleme

Mesaj gönderen cmkare »

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..
Kullanıcı avatarı
unicorn64
Üye
Mesajlar: 919
Kayıt: 04 Nis 2006 08:56
Konum: yine yeniden Ankara ^_^

Re: Her iki alanda dolu veya boşsa listeleme

Mesaj gönderen unicorn64 »

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

Resim
cmkare
Üye
Mesajlar: 177
Kayıt: 23 Ağu 2010 11:29

Re: Her iki alanda dolu veya boşsa listeleme

Mesaj gönderen cmkare »

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) )
Kullanıcı avatarı
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

Mesaj gönderen sabanakman »

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.
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) )
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)
/*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*/
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.

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. - .
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Her iki alanda dolu veya boşsa listeleme

Mesaj gönderen thelvaci »

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:

Kod: Tümünü seç

SELECT *
FROM Tablo
WHERE
   .. AND
   .. AND
   ISNULL(Not1, 'X') = ISNULL(Not1, 'X') AND
   ISNULL(Not2, 'Y') = ISNULL(Not2, 'Y')
Tabii bu durumda, Not1 ve Not2 alanları boş olan kayıtlar da listelenecektir. Sizin istediğiniz;
  • Not1 dolu olabilir Not2 boş olabilir -> Listelensin
    Not1 dolu olabilir Not2 dolu olabilir-> Listelensin
    Not1 boş olabilir Not2 dolu olabilir -> Listelensin
Aksi durumda listelenmesin ise;

Kod: Tümünü seç

SELECT *
FROM Tablo
WHERE
   .. AND
   .. AND
   ISNULL(Not1, 'X') + ISNULL(Not2, 'X') <> 'XX'
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.)
cmkare
Üye
Mesajlar: 177
Kayıt: 23 Ağu 2010 11:29

Re: Her iki alanda dolu veya boşsa listeleme

Mesaj gönderen cmkare »

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