Fehler bei "SELECT *, (SELECT (...) ...) AS anzahl WHERE anzahl > 0"

Hallo Forum,

eine Sache verstehe ich nicht und weiß auch nicht, wie ich das Problem lösen kann.
Ich habe folgende Abfrage:

SELECT *, (SELECT COUNT(t_tourdaten.region_id) FROM t_tourdaten 
WHERE t_regionen.region_id = t_tourdaten.region_id AND POSITION('' IN art) > 0 AND 
POSITION('DE' IN t_tourdaten.lkz) > 0 GROUP BY t_tourdaten.region_id) AS tour_cnt 
FROM t_regionen WHERE POSITION('DE' IN t_regionen.lkz) > 0 [color=#ff0000]AND tour_cnt > 0[/color] ORDER BY region

Es wird die Fehlermeldung erzeugt:

ERROR:  column "tour_cnt" does not exist
ZEILE 4: ...en WHERE POSITION('DE' IN t_regionen.lkz) > 0 AND tour_cnt >...
********** Fehler **********
ERROR: column "tour_cnt" does not exist
SQL Status:42703
Zeichen:296

Wieso wird diese Fehlermeldung erzeugt? Die Spalte tour_cnt existiert doch.
Wie kann ich die Abfrage so umbauen, dass die Bedingung tour_cnt > 0 erfüllt wird? Da stehe ich im Moment auf dem Schlauch.

Danke für die Hilfe.

Viele Grüße

JueDan

Weil man den Alias nicht in der gleichen “Ebene” direkt verwenden kann. Du musst eine derived Table daraus machen:

select *
from (
   SELECT *, 
          (SELECT COUNT(t_tourdaten.region_id) 
           FROM t_tourdaten 
           WHERE t_regionen.region_id = t_tourdaten.region_id 
              AND POSITION('' IN art) > 0 
              AND POSITION('DE' IN t_tourdaten.lkz) > 0 G
           ROUP BY t_tourdaten.region_id) AS tour_cnt 
  FROM t_regionen 
  WHERE POSITION('DE' IN t_regionen.lkz) > 0 
) t
where tour_cnt > 0 
ORDER BY region

Was genau willst Du eigentlich mit der Bedingung AND POSITION(’’ IN art) > 0 erreichen. Oder ist das ein Tippfehler?

Moin,

danke für die schnelle Antwort und wieder was gelernt.
Der Ausdruck AND POSITION(’’ IN art) > 0 ist kein Tippfehler. Das Feld art kann folgende Einträge annehmen ‘’, ‘BT’, ‘ST’, ‘KS’ oder Kombinationen davon.

Viele Grüße

JueDan

Warum dann nicht postion = ‘’?

“Kombinationen davon” klingt auch irgendwie gefährlich nach fehlender Normalisierung.

Hallo castorp,

es handelt sich um eine Datenbank, in der ich alle von mir begangenen Bergtouren speichere. Das Feld “art” gibt an, um welche Tourenart es sich handelt: Bergtour(BT), Schneeschuhtour(ST) oder Klettersteig(KS). Es gibt halt dabei auch Kombinationen wie z.B. eine Schneeschuhtour, die man auch als Bergtour machen kann. Dann enthält das Feld “art” “BTST” oder eben Bergtour mit Klettersteig “BTKS”. Siehe hier: Jürgen Dankoweit - FreeBSD-Onkel und Bergfex
Wenn Du so willst, ist das ein Bitfeld.

Viele Grüße und Danke

JueDan

Aber POSITION(’’ IN art) > 0 liefert immer true zurück wenn art nicht NULL ist.

Wenn Du auf einen leeren String testen willst, dann must Du art = ‘’ verwenden.
Wenn ein leerer String und NULL den gleichen Status identifizieren dann sowas wie coalesce(art, ‘’) = ‘’

Das weiß ich. Ich habe POSITION(’’ IN art) > 0 gewählt, weil es mir nur auf das Prinzip meiner ursprünglichen Frage ankam. Das Feld art ist nie leer.

Danke für die Antwort

JueDan