Madde

2013-07-11 31 views
6

İçerisindeki Oracle örneği Bu basit bir soru, WHERE numaralı makalede CASE kullanımının ayrıntılarını okudum, ancak nasıl kullanabileceğine dair net bir fikre sahip olamadım. Ben parametresinde gibi bir prosedür i_value varMadde

1 SELECT * FROM dual 
2 WHERE (1 =1) 
3  AND (SYSDATE+1 > SYSDATE) 
4  AND (30 > 40) 
5  AND (25 < 35); 

: Aşağıda benim örnek sorgu olduğunu. Eğer i_value 'S' ise 4. satırı göz ardı etmem gerekiyor ve i_value 'T' ise 5. satırı görmezden gelmem gerekiyor.

Şimdiden teşekkürler.

cevap

2

Bu sorunu çözmek için en iyi yol olduğunu düşünüyorum:

Tabii
select * 
from dual 
where (1 = 1) 
     and (sysdate + 1 > sysdate) 
     and case 
      when i_value = 'S' 
       then 
       case 
        when (25 < 35) 
        then 1 
        else 0 
       end 
      when i_value = 'T' 
       then 
       case 
        when (30 > 40) 
        then 1 
        else 0 
       end 
      end = 1; 

, Dinamik SQL kullanabilirsiniz, ama daha az etkili bir şekilde daha zorluk ve olurdu.

1
SELECT * FROM dual 
WHERE (1 =1) 
AND (SYSDATE+1 > SYSDATE) 
AND CASE WHEN i_value = 'S' THEN 1 ELSE CASE WHEN (30 > 40) THEN 1 ELSE 0 END END = 1 
AND CASE WHEN i_value = 'T' THEN 1 ELSE CASE WHEN (25 < 35) THEN 1 ELSE 0 END END = 1; 
+1

Bu, beklendiği gibi çalışmaz. Çünkü i_value 'S' olarak geçerse, kodunuzdaki 4. satır 0 olur ve durum başarısız olur. Yani, tüm çıktı hiç olmazdı. Derin bir bak. – ajmalmhd04

+0

Hata! - Sorunu gidermek için onu güncelledim. (Önceden "VE DAHA İZİN VERDİ" i_value = 'S' SONRA ELSE ... "0 ve 1 satırlarında 0 ile 1 arasında değişti. –

+0

bir daha gözden geçirin;) – ajmalmhd04

1

Neden böylece ser kullanım case?

SELECT * FROM dual 
    WHERE (1 =1) 
    AND (SYSDATE+1 > SYSDATE) 
    AND (((30 > 40) and i_value <> 'S') or i_value = 'S') 
    AND (((25 < 35) and i_value <> 'T') or i_value = 'T'); 
+0

Yine de bu daha iyi. Ama benim koduma uygun değil. (Yukarıdaki, büyük bir sorgudan kullandığım örnek bir sorgudur). Bu yüzden "eğer i_value = 'S' sonra" yöntemini kullandım. Aksi takdirde, her satırda büyük bir kod kullanmak zorundayım. Teşekkürler – ajmalmhd04

-1

Bu da işe yaramalıdır.

case 
    when (i_value = 'S' and (WHERE (1=1) AND (SYSDATE+1 > SYSDATE) AND (25 < 35))) then 1 
    when (i_value = 'T' and (WHERE (1=1) AND (SYSDATE+1 > SYSDATE) AND (30 < 40))) then 1 
    else 0 
end = 1