36 Stimmen

Fallausdrücke in Access

Können Sie case Ausdrücke in Access? Ich versuche, das maximale Datum aus 2 Spalten zu ermitteln, erhalte aber immer wieder Syntaxfehler im folgenden Code:

CASE 
  WHEN dbo_tbl_property.LASTSERVICEDATE > Contour_dates.[Last CP12 Date]
    THEN dbo_tbl_property.LASTSERVICEDATE 
  ELSE Contour_dates.[Last CP12 Date] 
END AS MaxDate

56voto

Mitch Wheat Punkte 287474

Sie können die IIF() stattdessen die Funktion.

IIF(condition, valueiftrue, valueiffalse)
  • condition ist der Wert, den Sie testen möchten.

  • valueiftrue ist der Wert, der zurückgegeben wird, wenn die Bedingung zu TRUE ausgewertet wird.

  • valueiffalse ist der Wert, der zurückgegeben wird, wenn die Bedingung zu FALSE ausgewertet wird.

Außerdem gibt es die Switch Funktion, die einfacher zu verwenden und zu verstehen ist, wenn Sie mehrere Bedingungen zu testen haben:

Switch( expr-1, value-1 [, expr-2, value-2 ] … [, expr-n, value-n ] )

Die Argumentliste der Funktion Switch besteht aus Paaren von Werten. Die Ausdrücke werden von links nach rechts ausgewertet, und die Wert, der mit dem ersten zu True ausgewerteten Ausdruck verbunden ist, wird zurückgegeben. Wenn die Teile nicht richtig gepaart sind, tritt ein Laufzeitfehler auf. Wenn zum Beispiel expr-1 Wahr ist, gibt Switch Wert-1 zurück. Wenn expr-1 falsch, aber expr-2 wahr ist, gibt Switch Wert-2 zurück, und so und so weiter.

Switch gibt einen Nullwert zurück, wenn:

  • Keiner der Ausdrücke ist wahr.

  • Der erste Ausdruck True hat einen entsprechenden Wert, der Null ist.

HINWEIS: Switch wertet alle Ausdrücke aus obwohl es nur einen von ihnen zurückgibt. Aus diesem Grund sollten Sie auf unerwünschte Nebeneffekte achten. Zum Beispiel, wenn die Auswertung eines beliebigen Ausdrucks zu einem Fehler bei der Division durch Null führt, tritt ein Fehler auf.

9voto

juckobee Punkte 1219

In Access gibt es keine Fallbeschreibung. Stattdessen können Sie die switch-Anweisung verwenden. Sie sieht in etwa so aus wie die unten stehende:

switch(dbo_tbl_property.LASTSERVICEDATE > Contour_dates.[Last CP12 Date],dbo_tbl_property.LASTSERVICEDATE,dbo_tbl_property.LASTSERVICEDATE <= Contour_dates.[Last CP12 Date],Contour_dates.[Last CP12 Date])

Weitere Informationen finden Sie unter: http://www.techonthenet.com/access/functions/advanced/switch.php

Oder ein Beispiel für die Implementierung einer Case-Funktion in VBA:

http://ewbi.blogs.com/develops/2006/02/adding_case_to_.html

Grüß Gott, J.

1voto

Michael Currie Punkte 12358

Solange man sich mit Zahlen beschäftigt, CASE ist nur syntaktischer Zucker . Sie können sie durch eine boolesche Multiplikation ersetzen.

Zum Beispiel, CASE WHEN A = 1 THEN 2 ELSE 3 END ist nur eine schönere Art zu schreiben

(-1) * ((A = 1) * 2 + (A <> 1) * 3)

(Die -1 ist erforderlich, weil Microsoft Jet wertet wahre boolesche Aussagen zu -1 aus .)

Also stattdessen:

CASE 
  WHEN dbo_tbl_property.LASTSERVICEDATE > Contour_dates.[Last CP12 Date]
    THEN dbo_tbl_property.LASTSERVICEDATE 
  ELSE Contour_dates.[Last CP12 Date] 
END AS MaxDate

Verwendung:

-1 * (
(dbo_tbl_property.LASTSERVICEDATE > Contour_dates.[Last CP12 Date]) * dbo_tbl_property.LASTSERVICEDATE +
(dbo_tbl_property.LASTSERVICEDATE <= Contour_dates.[Last CP12 Date]) * Contour_dates.[Last CP12 Date]
) AS MaxDate

Übrigens funktioniert diese Methode leider nicht, wenn Ihre CASE-Anweisung Zeichenketten enthält.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X