"SELECT ... AS ..." - column ... does not exist

Fragen und Probleme rund um die Abfragespache SQL.
juedan

"SELECT ... AS ..." - column ... does not exist

Beitrag von juedan » Fr 14. Dez 2018, 15:40

Hallo Forum,

nach langer Zeit mal wieder eine Frage, zu der ich keine Lösung finde.
Folgendes:

Code: Alles auswählen

SELECT a, b, c, (a+b+c) as d FROM t_table WHERE d > 0 ORDER BY d
...wirft die Fehlermeldung

Code: Alles auswählen

column "d" does not exist
Bei MySQL ist das kein Problem und als ich vor 25 Jahren SQL im Studium kennengelernt habe, wurden obige Konstrukte häufig verwendet.
Interessant daran ist auch, wenn ich WHERE... weglasse, gibt es keine Fehlermeldung,

Für eine Antwort immer dankbar

JueDan

akretschmer
Erfahrener Benutzer
Beiträge: 7551
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Re: "SELECT ... AS ..." - column ... does not exist

Beitrag von akretschmer » Fr 14. Dez 2018, 15:45

Ja, das KANN so nicht gehen. Weil erst einmal das WHERE ausgeführt wird, erst DANACH mit dem, was das Where liefert, die Berechnung und das 'erzeugen' der berechneten Spalte. Also, zu dem Zeitpunkt, wo das WHERE die Zeilen filtert, gibt es 'd' noch nicht. Also: statt d im Where den ganzen Ausdruck, der zu d wird.
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

akretschmer
Erfahrener Benutzer
Beiträge: 7551
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Re: "SELECT ... AS ..." - column ... does not exist

Beitrag von akretschmer » Fr 14. Dez 2018, 15:46

btw.:

Code: Alles auswählen

mysql> create table foo (a int, b int, c int);
ERROR 1050 (42S01): Table 'foo' already exists
mysql> drop table foo;
Query OK, 0 rows affected (0,02 sec)

mysql> create table foo (a int, b int, c int);
Query OK, 0 rows affected (0,02 sec)

mysql> select a,b,c,a+b+c as d from foo where d = 10;
ERROR 1054 (42S22): Unknown column 'd' in 'where clause'
mysql> 
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

akretschmer
Erfahrener Benutzer
Beiträge: 7551
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Re: "SELECT ... AS ..." - column ... does not exist

Beitrag von akretschmer » Fr 14. Dez 2018, 15:54

was du machen kannst:

Code: Alles auswählen

test=*# create table foo (a int, b int, c int);
CREATE TABLE
test=*# 
test=*# select a,b,c,a+b+c as d from foo where d = 10;
FEHLER:  Spalte »d« existiert nicht
LINE 1: select a,b,c,a+b+c as d from foo where d = 10;
                                               ^
test=*# with x as (select a,b,c,a+b+c as d from foo) select * from x where d = 10;
 a | b | c | d 
---+---+---+---
(0 rows)

test=*# 
ACHTUNG: das ist aus Performance-Sicht ein Desaster, da x zuerst materialisiert wird. Daher besser:

Code: Alles auswählen

test=*# select a,b,c,a+b+c as d from foo where a+b+c = 10;
 a | b | c | d 
---+---+---+---
(0 rows)

test=*# create index idx_abc on foo ((a+b+c));
CREATE INDEX
test=*# explain select a,b,c,a+b+c as d from foo where a+b+c = 10;
                              QUERY PLAN                               
-----------------------------------------------------------------------
 Bitmap Heap Scan on foo  (cost=4.23..14.89 rows=10 width=12)
   Recheck Cond: (((a + b) + c) = 10)
   ->  Bitmap Index Scan on idx_abc  (cost=0.00..4.23 rows=10 width=0)
         Index Cond: (((a + b) + c) = 10)
(4 rows)

test=*# 
das kann so sogar den Index nutzen.
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

juedan

Re: "SELECT ... AS ..." - column ... does not exist

Beitrag von juedan » Fr 14. Dez 2018, 20:05

Guten Abend akretschmer,

danke für die Antwort.
Jetzt ist es mir auch klar, bin halt doch etwas aus der Übung.

Bei der MySQL-Sache habe ich mich vertan. Statt WHERE habe ich dort HAVING, war ein klassischer Copy&Paste-Fehler. Aber das geht bei PG auch nicht.

Nach etwas tiefer gehender Überlegung habe ich das Problem so gelöst:
SELECT a,b,c, (a+b+c) as d FROM table ORDER BY d

Hintergrund der Geschichte ist, dass ich eine Tabelle mit Einträgen zu Webcams habe. Diese sollen im Umkreis von 30km liegen und nach ihrer Entfernung sortiert ausgegeben werden:

Code: Alles auswählen

SELECT standort,url,bildurl,copyright,copyright_url,Webcam_Distanz(%f,%f,lat,lon) AS distanz 
FROM t_webcams 
WHERE bildurl != '' AND aktiv = 1 
ORDER BY distanz ASC
LIMIT 6
(%f ist der Standort, in dessen Nähe die Cams stehen sollen)

Das Problem dieser Methode ist halt, dass auch Webcams angezeigt werden können, die jenseits des 30km-Radius liegen. Das erledige ich jetzt aber im PHP-Skript.

Beste Grüße

JueDan

PS: Die zugehörige Funktion

Code: Alles auswählen

CREATE OR REPLACE FUNCTION webcam_distanz(double precision, double precision, double precision, double precision)
  RETURNS double precision AS
$BODY$
 SELECT (6371 * acos(sin($1/57.295800) * sin($3/57.295800) +
        cos($1/57.295800) * cos($3/57.295800) * 
        cos($4/57.295800 - $2/57.295800))) AS result;
$BODY$
  LANGUAGE sql VOLATILE
  COST 100;

castorp
Erfahrener Benutzer
Beiträge: 1090
Registriert: Sa 27. Jun 2009, 22:24
Wohnort: Bayern

Re: "SELECT ... AS ..." - column ... does not exist

Beitrag von castorp » Fr 14. Dez 2018, 20:14

Für alles was mit Geo-Daten zu tun hat, nimmst Du besser PostGIS - da kann man das mit der Entfernung dann auch vernünftig indizieren, damit es schnell wird.

Deine webcam_distanz() sollest Du als "immutable" definieren. volatile ist für die Funktion die falsche Einstellung
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

akretschmer
Erfahrener Benutzer
Beiträge: 7551
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Re: "SELECT ... AS ..." - column ... does not exist

Beitrag von akretschmer » Fr 14. Dez 2018, 21:33

;-) @castorp
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

juedan

Re: "SELECT ... AS ..." - column ... does not exist

Beitrag von juedan » Fr 14. Dez 2018, 21:36

Guten Abend castorp

anfangs wollte ich auch PostGIS nehmen. Auf meinem privaten Server kein Problem, aber mein Webspace ist mit MySQL ausgestattet...
An meinem privaten PostgreSQL-Server hängt noch mein DaviCAL - deswegen diese seltsame Konstellation.

Danke für den Tipp mit "immutable" - habe ich geändert.

Schönen Abend noch

JueDan

Gisman
Erfahrener Benutzer
Beiträge: 1117
Registriert: Fr 20. Jan 2006, 15:30
Wohnort: Pfalz
Kontaktdaten:

Re: "SELECT ... AS ..." - column ... does not exist

Beitrag von Gisman » Sa 15. Dez 2018, 09:19

Vielleicht findest du da Hilfe, MySQL kann auch was mit Geometrien:

https://dev.mysql.com/doc/refman/8.0/en ... tions.html

Mea culpa, ich poste einen MySQL-Link in ein Postgres-Forum ;)

Viele Grüße Uwe

akretschmer
Erfahrener Benutzer
Beiträge: 7551
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Re: "SELECT ... AS ..." - column ... does not exist

Beitrag von akretschmer » Sa 15. Dez 2018, 13:15

Gisman hat geschrieben:
Sa 15. Dez 2018, 09:19

Mea culpa, ich poste einen MySQL-Link in ein Postgres-Forum ;)

Die öffentliche Steinigung erfolgt nächsten Dienstag, 15 Uhr ;-)
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Antworten