2010-11-02 47 views
5

Lütfen bu konuda bana katıl, bunu açıklamak oldukça zor ve doğru terminolojiyi kullanıp kullanmadığımı bilmiyorum.SQL: Koşullu Seçim İçinde Koşullu Seçim

Oldukça karmaşık bir seçim yapmam gerekiyor. Etkin olarak, seçime filtre uygulamak için hangi alanın kullanılacağına koşullu olarak karar veren bir seçim ifadesidir. Belirli bir tarih alanı boş değilse, o alandaki değerin belirli bir aralıkta olduğunu kontrol etmeliyim.

yalancı kod:

If [Date] is not null 
    Get sum (table.value) for rows Date >= dateValue and Date < dateValue 
Else 
    Get sum (table.value) for rows Int >= intValue and Int < intValue 

Bulunduğum girişimi:

SELECT CASE WHEN a.Date IS NOT NULL THEN 
(SUM(CASE WHEN (a.Date >= cal.Date) THEN ABS(a.Value) ELSE 0 END)) 
ELSE 
(SUM(CASE WHEN (b.Days >= 0) THEN ABS(a.Value) ELSE 0 END) 
END AS 'A' 
aynı masada başka bir alan, int alanını kontrol etmek gerekir Aksi takdirde bu tarih alanı boş ise belirli bir aralık içinde olduğu

Herhangi bir fikrin var mı? Daha fazla bilgiye ihtiyacınız olup olmadığını sorun. Şimdiden teşekkürler.

+0

Lütfen düzenlemeyi kontrol edin: – gbn

+0

Yup. Şerefe. Başlangıçta bir veya bir deyim vardı, ancak tarih alanı veri içermesine rağmen aralığın içine düşmese bile Tamsayı alanı sürüklenecekti. Orada null bir kontrol eklemeyi düşünmedin! Ah! – Damien

cevap

4

Bir yol, birlikte UNIONed olmak üzere 2 ayrı sorguya sahip olmaktır, ancak yalnızca bir yan tümce değer üretecektir. Bu, OR ifadelerine sahip olmayı önler.

SELECT SUM(Value) 
FROM MyTable 
WHERE MyTable.Date >= dateValue and Table.Date < dateValue --NULL Date = false always 
UNION ALL 
SELECT SUM(Value) 
FROM MyTable 
WHERE MyTable.Int >= intValue and Table.Int < intValue 
    AND --ignore this clause if date is NOT NULL 
    MyTable.Date IS NULL 

Düzenleme ile VEYA:

ben doğru ne yapmak istediğinizi yorumlayarak ediyorum gibi çalışır ve sürece, tüm bu uzakta pseudocode uzak değildir
SELECT SUM(Value) 
FROM MyTable 
WHERE 
    (
     MyTable.Date IS NOT NULL AND 
     MyTable.Date >= dateValue and Table.Date < dateValue 
    ) 
     OR --actually mutually exclusive 
    (
     MyTable.Date IS NULL AND 
     MyTable.Int >= intValue and Table.Int < intValue 
    ) 
+0

Bu, iki olası koşulu tek bir toplam olarak değil, iki ayrı toplam getirecektir. Orijinal posterin ne hakkında olduğunu söylemek zor, ama amaç sadece tek bir değer gibi geliyor. –

+0

@Sam: neden olacak? Madde 1 hiçbir satır verir DATE NULL, bu nedenle 2. madde geçerlidir. Ve DATE için 2 test null'tır ... eğer NULL deyim 1 satırlar vermezse (aralık filtreleri elbette doğruysa). İsterseniz, 1 NUMARASI NEDEN NEDEN DEĞİLDİR – gbn

+0

Evet, Üzgünüm açıklamak zor. Etkili bir şekilde sonuç satırlarım var, ancak buraya girmeye değmeyen nedenlerden ötürü, satırın, her ikisi de değil, bir tarih alanıyla veya bir tamsayı alanıyla belirli bir aralıkta olduğu belirtiliyor. Tarih alanı önceliğe sahiptir, ancak null ise tamsayı alanını kullanıyorum ama seçildikten sonra nasıl seçildiğine bakmaksızın aynı değeri elde ediyorum. Uf. – Damien

1

.

SELECT SUM(Value) 
FROM T 
WHERE 
     CASE WHEN DateValue IS NOT NULL 
       THEN DateValue BETWEEN FromDate AND ToDate 
       ELSE IntValue BETWEEN FromInt AND ToInt 
       END