komplettes Ergebnis in einer Spalte

Fragen und Probleme zu PL/pgSQL.
tutter
Neuer Benutzer
Beiträge: 23
Registriert: Mo 28. Nov 2016, 22:31

komplettes Ergebnis in einer Spalte

Beitrag von tutter » Mi 11. Jan 2017, 14:59

Hallo an alle,

ich habe hier ein Phänomen vor mir was ich mich überhaupt nicht erklären kann.

Code: Alles auswählen

CREATE  OR REPLACE FUNCTION Test (Integer) RETURNS SETOF "Messwert" AS'
	
	SELECT "Fuehler_1","Timestamp" FROM "Messwert" where "Wert" = $1;
	
	/*
	SELECT * FROM "Messwert" where "Wert" = $1;
	*/
'LANGUAGE sql;

Ich erhalte stets als Ausgabe immer nur eine Tabelle wo alle Werte aus Fuehler_1 und Timestamp drinstehen. Warum? ich müstte doch 2 Spalten als Ergebnis erhalten oder? Ich habe das Verhalten ob bei Select * oder beim direkten benennen aller Spalten.

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

Re: komplettes Ergebnis in einer Spalte

Beitrag von castorp » Mi 11. Jan 2017, 15:02

Vermutlich verwendest Du

Code: Alles auswählen

select test(42)
Da die Funktion aber ein Set zurückgibt, musst Du sie wie eine Tabelle verwenden:

Code: Alles auswählen

select * from test(42);
Kleiner Tipp am Rande: vermeide die doppelten Anführungsstriche in SQL - das bringt auf lange Sicht mehr Ärger als Nutzen.
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

tutter
Neuer Benutzer
Beiträge: 23
Registriert: Mo 28. Nov 2016, 22:31

Re: komplettes Ergebnis in einer Spalte

Beitrag von tutter » Mi 11. Jan 2017, 15:14

Danke Castorp danke für die sehr schnelle Antwort. Aber ich versteh sie leider nicht ganz. Wenn ich dich richtig verstehe sollte ich nicht die Kurzschreibweise von Select test(42) nutzen sondern Select * from test(42) aber was sagt mir das genau? ich kenne nur den Aufruf Select * from test where ... = 42 das wiederum würde doch dem entsprechen was ich oben geschrieben habe oder?

Das mit den Anführungsstrichen ist auch so eine Sache. Bei meinen Abfragen klappt nichts wenn nicht die Tabellenbezeichnungen (egal ob Umlaute oder Sonderzeichen enthalten sind) in Anführungsstrichen gesetzt sind. Ich vermute das ist irgendeine Einstellung aber ich habe noch nichts gefunden und mir die Finger schon wund gegoogelt.

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

Re: komplettes Ergebnis in einer Spalte

Beitrag von akretschmer » Mi 11. Jan 2017, 15:17

neben dem von castorp gesagtem: was hat denn die Tabelle "Messwert" für einen Aufbau? Wenn Du SETOF "Messwert" definierst, dann sollte da auch dieser Tabellentyp rauskommen. Du hast im Select aber nur 2 Spalten Fuehler_1 und Timestamp, es gibt aber auch noch Wert, siehe Where-Condition. Das paßt nicht ganz zusammen.

Und ja: Du solltest den Body von Funktionen mit Dollarquoting behandeln, die ' sind sowas von altmodisch ...
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

tutter
Neuer Benutzer
Beiträge: 23
Registriert: Mo 28. Nov 2016, 22:31

Re: komplettes Ergebnis in einer Spalte

Beitrag von tutter » Mi 11. Jan 2017, 15:18

Du meinst den Funktionsaufruf! Sorry! jetzt habe ich es gerafft! Aber kannst du vielleicht noch etwas zu den Anführungsstrichen sagen?

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

Re: komplettes Ergebnis in einer Spalte

Beitrag von akretschmer » Mi 11. Jan 2017, 15:22

Um mal etwas verwirrung zu stiften...

Code: Alles auswählen

test=*# create table foo (c1 int, c2 int, c3 int);
CREATE TABLE
test=*# create or replace function get_foo(int) returns setof foo as $$select c1, c2, c3 from foo where c3 = $1; $$language sql;
CREATE FUNCTION
test=*# insert into foo values (1,2,3);
INSERT 0 1
test=*# insert into foo values (4,5,6);
INSERT 0 1
test=*# insert into foo values (11,22,3);
INSERT 0 1
test=*# select * from get_foo(3);
 c1 | c2 | c3 
----+----+----
  1 |  2 |  3
 11 | 22 |  3
(2 Zeilen)

test=*# create or replace function get_foo(int) returns setof foo as $$select c1, c2 from foo where c3 = $1; $$language sql;
FEHLER:  Rückgabetyp von Funktion stimmt nicht überein; deklariert als foo
DETAIL:  Die letzte Anweisung gibt zu wenige Spalten zurück.
KONTEXT:  SQL-Funktion »get_foo«
test=*# 

Die " mußt Du verwenden, weil Du klugerweise Tabellen und Spalten mit Großbuchstaben angelegt hast.
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

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

Re: komplettes Ergebnis in einer Spalte

Beitrag von castorp » Mi 11. Jan 2017, 15:25

akretschmer hat geschrieben:
Mi 11. Jan 2017, 15:22
Die " mußt Du verwenden, weil Du klugerweise Tabellen und Spalten mit Großbuchstaben angelegt hast.
Das muss unklugerweise heissen :rolleyes:
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

tutter
Neuer Benutzer
Beiträge: 23
Registriert: Mo 28. Nov 2016, 22:31

Re: komplettes Ergebnis in einer Spalte

Beitrag von tutter » Mi 11. Jan 2017, 15:25

@akretschmer ihr macht mich hier fertig. Das geht ja wie das Bretzel backen hier! WOW!
Kannst du mir das mit dem Dollarquoting zeigen? bzw. einen link geben wo ich das nachlesen kann? ich finde immer nur diese Variante mit den ' ' und altmodisch will ich doch nicht bleiben!
Das mit dem Groß- und Kleinschreiben habe ich jetzt verstanden! danke dir!

tutter
Neuer Benutzer
Beiträge: 23
Registriert: Mo 28. Nov 2016, 22:31

Re: komplettes Ergebnis in einer Spalte

Beitrag von tutter » Mi 11. Jan 2017, 15:27

@castorp ja Asche auf mein Haupt aber manche sollen auch wirklich so heißen! aber ich habe es jetzt gerafft!

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

Re: komplettes Ergebnis in einer Spalte

Beitrag von castorp » Mi 11. Jan 2017, 15:28

tutter hat geschrieben:
Mi 11. Jan 2017, 15:25
Kannst du mir das mit dem Dollarquoting zeigen? bzw. einen link geben wo ich das nachlesen kann?
Nachlesen: https://www.postgresql.org/docs/current ... AR-QUOTING

Beispiele: https://www.postgresql.org/docs/current ... N-EXAMPLES
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

Antworten