Anzeige:
Ergebnis 1 bis 6 von 6

Thema: Wie in SQL NULL durch 0 ersetzen?

  1. #1
    Registrierter Benutzer Avatar von Hans-Georg Normann
    Registriert seit
    04.03.2000
    Ort
    Uetersen
    Beiträge
    571

    Wie in SQL NULL durch 0 ersetzen?

    Diese Finanzdatenbank bringt mich um den Verstand

    Ich habe ein Tabelle Forderungen (RECEIVABLES) und eine Zahlungen (PAYMENTS). Gesucht werden alle Forderungen in Fremdwährung, welche noch nicht ausgeglichen sind. Das ganze kann ich nur mittels Journal festellen, da die Auswertung auch rückwirkend sein muß. Als Datenbank wir Firebird 1.5 eingesetzt.

    Das hier läuft schon ganz prächtig:
    Code:
    Select
      R.ACCOUNT,
      R.DOCUMENT_NO,
      SUM(R.RECEIVABLE)                  RECEI,
      SUM(P.PAYMENT)                     PAYED,
      SUM(R.RECEIVABLE) + SUM(P.PAYMENT) OP,
      SUM(R.CURR_RECEIVABLE)             CURR_RECEI,
      SUM(P.PAYMENT * R.EXCHANGE_RATE)   CURR_PAYED,
      SUM(R.CURR_RECEIVABLE) +
        SUM(P.PAYMENT * R.EXCHANGE_RATE) CURR_OP
    FROM RECEIVABLES R LEFT OUTER JOIN PAYMENTS P ON (
         R.ACCOUNT  = P.ACCOUNT
     AND R.DOCUMENT_NO = P.DOCUMENT_NO
    )
    Where R.FINANCIAL_MONTH < 200402
      AND R.CURR_NO = 3
    GROUP  BY   R.ACCOUNT, R.DOCUMENT_NO
    Problem :
    Wenn noch keine Zahlungen vorhanden sind, dann erhalte ich bei allen ausgegebenen Sätzen die Funktionen wie SUM(P. irgendwas) enthalten, den Wert NULL. Damit kann ich leider nicht rechnen.

    Kann ich SQL irgendwie dazu bringen, statt NULL 0.0 auszugeben? Die letzte Abfragebedingung soll nämlich

    Code:
    HAVING SUM(R.RECEIVABLE) + SUM(P.PAYMENT) <> 0.0
    sein.

    Hans
    333 Mhz, 466 MHz, neee, ich hab was neues zuhause.....

  2. #2
    Registrierter Benutzer
    Registriert seit
    05.05.2004
    Beiträge
    212
    warum lässt du null nicht durch 0 ersätzen?
    update tabelle set spalte ='0' where spalte like null

    cu SHB

  3. #3
    Registrierter Benutzer Avatar von Hans-Georg Normann
    Registriert seit
    04.03.2000
    Ort
    Uetersen
    Beiträge
    571
    Dazu müsste ich in der Zahlungstabelle für jede vorhandene Forderung einen dummy Datensatz erzeugen. Das wäre zwar eine Möglichkeit, erzeugt aber m. E. ziemlich viel Ballast.

    Hans
    333 Mhz, 466 MHz, neee, ich hab was neues zuhause.....

  4. #4
    Registrierter Benutzer
    Registriert seit
    20.07.2000
    Ort
    Österreich
    Beiträge
    189
    ich bin mir nicht sicher ob die funktion im sql standard drinnen ist und ob es sie in firebird gibt, aber mit postresql und oracle funktion das mit der funktion nvl(spalte, 0).

    edit: hab gerade nochmals nach geschaut: in postgresql gibt es die funktion doch nicht.
    Geändert von Alex_K (28-12-2004 um 22:21 Uhr)

  5. #5
    Registrierter Benutzer Avatar von Hans-Georg Normann
    Registriert seit
    04.03.2000
    Ort
    Uetersen
    Beiträge
    571
    Danke, das war genau der richtige Tipp. Das gibt's aber in Firebird scheinbar auch noch nicht. Aber immerhin habe ich jetzt einiges in der Knowledgebase von FB gefunden. Man hat es also bereits zur Kenntnis genommen.

    There are NVL functions in fbudf. For strings (CHAR and VARCHAR) you can
    use:

    select sNVL(f1) || sNVL(f2) from table

    However, this functions only exist for Windows, on other platforms you
    may search the web for some other UDFs that do this.

    Third option is to write the stored procedure which will do the select
    and return exactly what you need.
    Quelle: http://www.ibphoenix.com/archive/main.nfs?a=archive&l=;FB_SUPPORT;ID='1334'

    Dann werde ich das wohl über eine Stored Procedure machen müssen.

    Hans
    333 Mhz, 466 MHz, neee, ich hab was neues zuhause.....

  6. #6
    Registrierter Benutzer
    Registriert seit
    21.06.1999
    Beiträge
    677
    In PostgreSQL geht das mit CASE oder COALESCE. CASE ist glaube ich SQL2 (oder erst 3?) Standard.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •