2012-05-08 12 views
7

İki sayıyı karşılaştırmak istiyorum.Oracle: Bir sorguda iki NUMARı karşılaştırarak 'DOĞRU' veya 'YANLIŞ' değerlerini nasıl alabilirim?

SELECT 1 > 2 from dual 
: en ie 1 ve 2.

aşağıdaki sorguyu yazmak için denedim ama beklendiği gibi basitçe çalışmıyor

(: ORA-00923: bulunamadı anahtar kelime GELEN umulmadık bir yerde Toad diyor) alalım

DECODE bir Anahtar durumu gibi bir şeydir, bu yüzden bir seçim değerlendirmesinin sonucunu (yani bir sayı karşılaştırması) seçme listesine nasıl yerleştirebilirim?

select DECODE(SIGN(actual - target) 
      , -1, 'NO Bonus for you' 
      , 0,'Just made it' 
      , 1, 'Congrats, you are a winner') 
from some_table 

daha zarif bir yolu var mı yani:

ben SEÇ LİSTESİ bir işlevleri kullanarak bir çözüm yerine bir ifade bulduk?

Ayrıca iki tarihi nasıl karşılaştırırım?

+1

ben SEÇ LİSTESİ'nde yerine ifadenin FONKSİYONLARI kullanarak bir çözüm bulduk: yani DeCODE (SIGN (gerçek-hedef), -1, 'sizin için HAYIR Bonus', 0, 'Sadece yapılan ', 1,' Tebrikler, siz bir kazanansınız '). Daha şık bir yol var mı? VE nasıl olur iki tarihini karşılaştır – Revious

+1

Lütfen yorumunuzu bırakmak yerine, ilgili bilgileri eklemek için sorunuzunuzu düzenleyin. arasında – APC

+0

olası çift [Oracle: seçim listesinde tam sayı arasındaki karşılaştırma] (http://stackoverflow.com/questions/10494955/oracle-comparison-between-integer-in-select-list) –

cevap

5

SIGN() işlevi, muhtemelen bir> b, a = b ve < b kodunu test etmek isterseniz, ilgilendiğiniz eşitliği (/) eşitlemenin en iyi yoludur (muhtemelen). veya argüman olarak sayısal sayısal.

Daha doğrusu bir kod çözme yerine, tercihe göre bir Vaka deyimini kullanmayı tercih ediyorum.

Select 
    case sign(actual-target) 
    when -1 then ... 
    when 0 then ... 
    when 1 then ... 
    end 
+4

Bunun için "SIGN" işlevinin kullanılması, "DECODE" 'ün tümü için gerekliydi, ancak' CASE 'ile kodun daha az net olduğunu düşünüyorum. Karşılaştırmayı basitçe yazabilirsiniz: 'DAHA SONRA a> b SONRA ... BİÇEN a = b SONRA ... BİRLİKTE

+1

Muhtemelen, özellikle karşılaştırma çok kısasa (a> b) ...SIGN() 'in, tekrarlamak istemediğiniz biriyle çalışmak için bazı korkunç uzun ifadeleriniz varsa daha yararlı olacağını düşünmeliyim (örneğin, bir şeyin daha önce mi, sonra mı, sonra mı, sonra mı? ifadesi değerlendirmek için çağrı yapmak için biraz pahalı veya bazı pahalı fonksiyonlar olabilir mali yıl. –

7

(en azından oracle) SQL hiçbir boole türleri bulunmaktadır.
Eğer case kullanabilirsiniz:

SELECT CASE when 1 > 2 THEN 1 ELSE 0 END FROM dual 

Ama çözeltisi (kod çözme) de iyidir, sen sql ile

YÖNTEMİ iki tarihleri ​​karşılaştırabilirsiniz here

+0

SQL standardı * * bir tanımlıyor bool veri türü, ancak - doğru bir şekilde belirttiğiniz gibi - Oracle SQL bunu desteklemez (diğer DBMS'lerden farklı olarak). PL/SQL prosedüründe boole değişkenlerini tanımlayabilirsiniz. –

1

okumak (1):

SELECT TO_DATE('01/01/2012') - TO_DATE('01/01/2012') 
FROM DUAL--gives zero 

YÖNTEM (2):

SELECT CASE 

when MONTHS_BETWEEN('01/01/2012','01/01/2010') > 0 
THEN 'FIRST IS GREATER' 
ELSE 'SECOND IS GREATER OR EQUAL' END 

FROM dual 

üzgünüm ben kod kayboldu biçimlendirme araç çubuğunu biçimlendirmek olamaz! kimse biliyor mu?

1
SELECT (CASE 
WHEN (SIGN(actual - target) > 0) THEN 
'NO Bonus for you' 
ELSE 
'Just made it' END) 
FROM dual 
İlgili konular