Groups | Search | Server Info | Login | Register


Groups > de.comp.datenbanken.misc > #2566

Re: Postgres: CASE in Abfrage

From Tim Landscheidt <tim@tim-landscheidt.de>
Newsgroups de.comp.datenbanken.misc
Subject Re: Postgres: CASE in Abfrage
Date 2024-06-06 17:22 +0000
Organization https://www.tim-landscheidt.de/
Message-ID <87tti63s1h.fsf@vagabond.tim-landscheidt.de> (permalink)
References <v3spoi$20i8$1@rabbit.rsli.de>

Show all headers | View raw


Volker Englisch <eh41@selene.inka.de> wrote:

> Ich bin mit PostgreSQL eher hobbymäßig beschäftigt und habe eine
> Datenbank für Arbeitszeiten und Termine. Die Tabelle für Termine sieht
> in Kurzfassung so aus:

>   Spalte  |              Typ
> ----------+--------------------------------+
>  id       | integer
>  person   | character(1)
>  datum    | date
>  von      | time without time zone
>  text     | character varying(80)
>  kz       | numeric(1,0)
>  druckkz  | numeric(1,0)
>  username | character(8)
>  zugriff  | timestamp(0) without time zone
>  externkz | numeric(1,0)
>  listkz   | numeric(1,0)
>  vortag   | numeric(1,0)

> Bisher wurden immer Termine ausgegeben, die am heutigen oder morgigen
> Tag anstehen. Die Spalte "vortag" ist neu und soll steuern, ob ein
> Termin tatsächlich schon am Vortag ausgegeben werden soll. Die
> Ermittlung des (Vor-)tages fand so statt:

> WHERE (datum::TEXT = TO_CHAR(now(), 'YYYY-MM-DD')
> OR (datum - INTEGER '1')::TEXT = TO_CHAR(now(), 'YYYY-MM-DD'))
> AND (kz = 0 OR kz= $kz)

Für Vergleiche zwischen Kalenderdaten, die auch als DATE ge-
speichert werden, empfiehlt es sich, auf das Umwandeln zu
verzichten:

| WHERE (datum = CURRENT_DATE
| OR (datum - INTEGER '1') = CURRENT_DATE)
| AND (kz = 0 OR kz= $kz)

> Nun soll die mit OR beginnende Zeile so geändert werden, daß
> sie nur beachtet wird, wenn das Feld "vortag" eine 1 enthält. Mein
> Versuch:

> CASE vortag = 1
>   THEN OR (datum - INTEGER '1')::TEXT = TO_CHAR(... usw)
>   ELSE ')'
> END

> Das ')' wegen der sonst fehlenden schließenden Klammer. Postgres sagt:
> Syntaxfehler bei CASE ...

> Geht das überhaupt - in eine WHERE-Anweisung eine Bedingung einzubauen?

> Dankeschön für einen kleinen "Tritt" in die richtige Richtung...

Ja, nur muss diese Bedingung Teil der WHERE-Klausel sein.
Beispiel, wenn ich Deine Logik richtig verstanden habe:

| WHERE CASE WHEN vortag = 1 THEN datum = CURRENT_DATE - 1
| ELSE datum = CURRENT_DATE END
| AND (kz = 0 OR kz= $kz)

Das heißt, der Teil vor AND wird TRUE, falls entweder vortag
1 und datum gestern ist oder vortag nicht 1 und datum heute,
sonst FALSE.

Tim

Back to de.comp.datenbanken.misc | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

Postgres: CASE in Abfrage Volker Englisch <eh41@selene.inka.de> - 2024-06-06 18:56 +0200
  Re: Postgres: CASE in Abfrage Tim Landscheidt <tim@tim-landscheidt.de> - 2024-06-06 17:22 +0000
    Re: Postgres: CASE in Abfrage Volker Englisch <eh41@selene.inka.de> - 2024-06-07 18:29 +0200
  Re: Postgres: CASE in Abfrage Thomas Noll <-_tn_-@web.de> - 2024-06-06 17:39 +0000
    Re: Postgres: CASE in Abfrage Volker Englisch <eh41@selene.inka.de> - 2024-06-07 18:31 +0200
      Re: Postgres: CASE in Abfrage Thomas Noll <-_tn_-@web.de> - 2024-06-07 17:24 +0000
        Re: Postgres: CASE in Abfrage Volker Englisch <eh41@selene.inka.de> - 2024-06-07 22:24 +0200
  Re: Postgres: CASE in Abfrage "Peter J. Holzer" <hjp-usenet4@hjp.at> - 2024-06-06 20:18 +0200
    Re: Postgres: CASE in Abfrage Volker Englisch <eh41@selene.inka.de> - 2024-06-07 18:39 +0200

csiph-web