2013-02-19 12 views
43

Mam zapytanie, które zwraca wartość kursu wymiany skonfigurowaną w naszym systemie. Nie każde zamówienie będzie miało kurs wymiany (currate.currentrate), więc zwraca wartości null.Zapytanie SQL, jeśli wartość jest pusta, a następnie zwraca 1

Czy mogę go przywrócić 1 zamiast wartości zerowej?

Coś jak if Być może:

if isnull(currate.currentrate) then 1 else currate.currentrate 

Oto moje zapytanie poniżej. Bardzo doceniam twoją pomoc!

SELECT  orderhed.ordernum, orderhed.orderdate, currrate.currencycode, currrate.currentrate 
FROM   orderhed LEFT OUTER JOIN 
        currrate ON orderhed.company = currrate.company AND orderhed.orderdate = currrate.effectivedate 
+4

Patrz [ 'ISNULL'] (http://msdn.microsoft.com/en-us/library/ms184325.aspx) (przeczytaj: używaj tego, jak został zaprojektowany). –

+1

@ pst 'COALESCE' jest standardem SQL i jest ogólnie zalecany w tych przypadkach. również istnieją znaczne różnice w sposobie reagowania na typy danych. może powinieneś zgłosić swój komentarz z dodatkowymi informacjami. – swasheck

+0

@swasheck Dokumentacja to robi. Łączy się również z COALESCE. –

Odpowiedz

74

Możesz użyć instrukcji CASE.

SELECT 
    CASE WHEN currate.currentrate IS NULL THEN 1 ELSE currate.currentrate END 
FROM ... 
+0

@pst - Zmiana kolejności operacji nie byłaby trudna ... –

+1

Dziękuję za @ pomoc! To działało jak czar! – jenhil34

+1

@ Ek0nomik Przyznałem powyższą równoważność i nie uważam, aby zastosowanie obniżenia głosem w celu wyciągnięcia punktu lub uzyskania lepszego wyjaśnienia czyni z niego "twardego twardziela". –

39

Można użyć COALESCE:

SELECT orderhed.ordernum, 
    orderhed.orderdate, 
    currrate.currencycode, 
    coalesce(currrate.currentrate, 1) as currentrate 
FROM orderhed 
LEFT OUTER JOIN currrate 
    ON orderhed.company = currrate.company 
    AND orderhed.orderdate = currrate.effectivedate 

lub nawet IsNull():

SELECT orderhed.ordernum, 
    orderhed.orderdate, 
    currrate.currencycode, 
    IsNull(currrate.currentrate, 1) as currentrate 
FROM orderhed 
LEFT OUTER JOIN currrate 
    ON orderhed.company = currrate.company 
    AND orderhed.orderdate = currrate.effectivedate 

Oto artykuł, aby pomóc zdecydować między COALESCE i IsNull:

http://www.mssqltips.com/sqlservertip/2689/deciding-between-coalesce-and-isnull-in-sql-server/

+3

+1, ponieważ masz niebieskie stopy. – Kermit

+3

@njk oni naprawdę są ... Jestem częścią smurf – Taryn

+0

Przydatny link. Świetny dodatek do tej odpowiedzi. – Ellesedil

2
SELECT orderhed.ordernum, orderhed.orderdate, currrate.currencycode, 

case(currrate.currentrate) when null then 1 else currrate.currentrate end 

FROM orderhed LEFT OUTER JOIN currrate ON orderhed.company = currrate.company AND orderhed.orderdate = currrate.effectivedate 
0

spróbować jak poniżej ...

CASE 
WHEN currate.currentrate is null THEN 1 
ELSE currate.currentrate 
END as currentrate 
-1

a) Jeśli chcesz 0 gdy wartość jest pusta

SELECT isnull(PartNum,0) AS PartNumber, PartID 
FROM Part 

b) Jeśli chcesz 0, gdy wartość jest zerowa, a inaczej 1

SELECT 
    (CASE 
    WHEN PartNum IS NULL THEN 0 
    ELSE 1 
    END) AS PartNumber, 
    PartID 
FROM Part 
Powiązane problemy