select
c.name,
exists(select * from share_buy_offers where share = c.id) as buy
from companies c;
funktioniert, als wäre EXISTS ein Funktion.
mfg Torsten
Gruß, Urs
Glaube ich nicht. In DB2 UDB funktioniert es nicht, und die sind sehr
ANSI-treu. Was soll denn überhaupt der Returntyp von "Exists" sein?
"Boolean" ist nicht seit Urzeiten Ansi-Standard.
Im where-Teil ist das natürlich was anderes.
Joachim
Nun ja, die Doku von PG nennt es 'SQL-compliant' und das glaube ich dann
auch einfach mal.
> ANSI-treu. Was soll denn überhaupt der Returntyp von "Exists" sein?
,----[ http://www.postgresql.org/docs/8.1/interactive/functions-subquery.html ]
| The argument of EXISTS is an arbitrary SELECT statement, or subquery.
| The subquery is evaluated to determine whether it returns any rows. If
| it returns at least one row, the result of EXISTS is "true"; if the
| subquery returns no rows, the result of EXISTS is "false".
`----
end
Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de
Ein Kollege hat es für mich mal unter Oracle ausprobiert, dort geht es
nicht:
SQL> select exists(select * from dual) from dual;
select exists(select * from dual) from dual
*
FEHLER in Zeile 1:
ORA-00936: Ausdruck fehlt
Aber das muß ja nichts bedeuten ;-)
mfg Torsten
On 6 Jul., 10:02, Torsten Robitzki <MyFirstn...@Robitzki.de> wrote:
> FEHLER in Zeile 1:
> ORA-00936: Ausdruck fehlt
das exists läßt sich bei Oracle nur in der Where-Klausel verwenden,
das klappt z.B.:
select sysdate from dual where exists(select * from dual);
Boolean kennt Oracle zwar als Datentyp, ist aber nicht für
Tabellenspalte zu verwenden. Und selektieren geht auch :-(
select 1=1 from from dual
*
FEHLER in Zeile 1:
ORA-00923: Schlüsselwort FROM nicht an erwarteter Stelle gefunden
Und jetzt nochmal zum exists, das ist bei Oracle nur eine
Pseudospalte:
declare test boolean:=true;
begin
test := exists(select * from dual) ;
if test = true then
dbms_output.put_line ( 'wahr' );
else
dbms_output.put_line ( 'falsch' );
end if;
end;
/
FEHLER in Zeile 3:
ORA-06550: Zeile 3, Spalte 12:
PLS-00204: Funktion oder Pseudo-Spalte 'EXISTS' darf nur innerhalb
einer SQL-Anweisung verwendet werden
ORA-06550: Zeile 3, Spalte 3:
PL/SQL: Statement ignored
hth
Kay
DB2 auf z/OS mag es genauso wenig als Funktion, da vermute ich mal,
dass es doch nicht so ganz ANSI ist (wer hat's erfunden?)
select 'exist', exists(select * from sysibm.systables where name
'T000')
from sysibm.sysdummy1;
---------+---------+---------+---------+---------+---------+---------
+-----
DSNT408I SQLCODE = -104, ERROR: ILLEGAL SYMBOL "SYSIBM". SOME SYMBOLS
THAT
MIGHT BE LEGAL ARE: + - AS ORDER
In der where-Klausel ist es dann wieder kein Problem
select 'exist in where'
from sysibm.sysdummy1
where exists(select * from sysibm.systables where name 'T000');
---------+---------+---------+---------+---------+---------+---------
+-----
exist in where
Kay
In PG geht sowas:
test=# create table foo (id int);
CREATE TABLE
test=*# insert into foo values (1);
INSERT 0 1
test=*# select exists(select * from foo where id = 1);
?column?
----------
t
(1 row)
test=*# select exists(select * from foo where id = 2);
?column?
----------
f
(1 row)
aber bewußt verwendet hab ich das glaub ich noch nie...
Das ist korrekt so. Wenn man aus dem Operator EXISTS eine Funktion machen
will, wäre sowas wie
COALESCE(SELECT True WHEN EXISTS (...)), False)
zu verwenden.
>> Das ist ANSI SQL schon seit U(h)rzeiten.
>
> Glaube ich nicht. In DB2 UDB funktioniert es nicht, und die sind sehr
> ANSI-treu.
IBM versucht zwar immer, die eigene Syntax im Standard SQL
durchzusetzen, aber ansonsten kümmert man sich nicht wirklich drum.
Siehe v.a. Funktionen wie substr, month, ltrim, left usw., die wirklich
einfach zu implementieren wären mit der richtigen Syntax.
Ich suche seit Jahren nach einem offiziellen Dokument, wo drinsteht, was
und was nicht bei DB2 Standard-konform implementiert ist.
Da ist IBM wie Microsoft, wenn die User nicht wissen, was Standard ist,
dann nehmen sie schon an, es wäre unsere Syntax.
Selbst Oracle schreibt inzwischen ganz genau, das können wir und das nicht.
> Was soll denn überhaupt der Returntyp von "Exists" sein?
> "Boolean" ist nicht seit Urzeiten Ansi-Standard.
Nö, gibt's erst seit SQL:99, aber in der IT sind das schon Urzeiten :-)
Dieter
>
> > Was soll denn überhaupt der Returntyp von "Exists" sein?
>> "Boolean" ist nicht seit Urzeiten Ansi-Standard.
>
> Nö, gibt's erst seit SQL:99, aber in der IT sind das schon Urzeiten :-)
>
Naja, ANSI-Standards in real existierenden DBMS? Da sind wir doch mit
92 hoch zufrieden.
Joachim
Oracle kennt in SQL übrigens immer noch keinen Boolean-Typ, wohl aber
in PL/SQL.
Urs
> Du hast natürlich recht, und ich widerrufe hiermit und lese nächstes
> Mal die Frage genauer.
>
> Oracle kennt in SQL übrigens immer noch keinen Boolean-Typ, wohl aber
> in PL/SQL.
EXISTS in SQL ist auch keine Funktion sondern ein Prädikat bzw. Quantor wie ANY,
ALL, etc. Der Existenzquantor halt.
Gruß
Peter
--
The only way to keep your health is to eat what you don't want, drink what
you don't like, and do what you'd rather not. -- Mark Twain
http://euler.homelinux.net/ - Meine Baustelle und mein Spielplatz