Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

SQL: Ist EXISTS eine Funktion

82 views
Skip to first unread message

Torsten Robitzki

unread,
Jul 5, 2007, 10:31:11 AM7/5/07
to
Hallo,
ich habe hier unter mySQL eine nette Möglichkeit gefunden, eine Flag zu
setzen, wenn in einer Untergeordneten Tabelle Einträge vorhanden sind.
Ich frag mich nun, ob das gültiges SQL ist, oder ob das einfach nur an
der Art und Weise, in der EXISTS in mySQL implementiert ist, liegt dass
es funktioniert.

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

Urs Metzger

unread,
Jul 5, 2007, 11:31:17 AM7/5/07
to
Torsten Robitzki schrieb:
Das ist ANSI SQL schon seit U(h)rzeiten.

Gruß, Urs

Joachim Pense

unread,
Jul 5, 2007, 6:18:14 PM7/5/07
to

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

Andreas Kretschmer

unread,
Jul 6, 2007, 1:06:17 AM7/6/07
to
begin Joachim Pense schrieb:

>>> funktioniert, als wäre EXISTS ein Funktion.
>>>
>>> mfg Torsten
>>>
>> Das ist ANSI SQL schon seit U(h)rzeiten.
>>
>
> Glaube ich nicht. In DB2 UDB funktioniert es nicht, und die sind sehr

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

Torsten Robitzki

unread,
Jul 6, 2007, 4:02:07 AM7/6/07
to
Torsten Robitzki wrote:
> funktioniert, als wäre EXISTS ein Funktion.

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

Kay Kanekowski

unread,
Jul 6, 2007, 5:15:42 AM7/6/07
to
Moin, moin,

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

Kay Kanekowski

unread,
Jul 6, 2007, 5:28:12 AM7/6/07
to
Moin, moin,

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

Andreas Kretschmer

unread,
Jul 6, 2007, 5:45:14 AM7/6/07
to
begin Kay Kanekowski schrieb:

> Moin, moin,
>
> 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.:

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...

Lutz Donnerhacke

unread,
Jul 6, 2007, 6:00:06 AM7/6/07
to
* Kay Kanekowski wrote:
> 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);

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.

Dieter Noeth

unread,
Jul 6, 2007, 8:42:23 AM7/6/07
to
Joachim Pense wrote:

>> 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

Joachim Pense

unread,
Jul 6, 2007, 3:28:30 PM7/6/07
to
Am Fri, 06 Jul 2007 14:42:23 +0200 schrieb Dieter Noeth:

>
> > 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

Urs Metzger

unread,
Jul 6, 2007, 6:13:18 PM7/6/07
to
Dieter Noeth schrieb:
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.

Urs

Peter Schneider

unread,
Jul 6, 2007, 6:20:23 PM7/6/07
to
Urs Metzger wrote:

> 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

0 new messages