hilpers


  hilpers > comp.* > comp.datenbanken.misc

 #1  
23.03.2006, 09:15
Marcel Müller
Hallo,

ich habe in SQL häufiger folgendes Problem: ich muss das Ergebnis einer
Bedingung innerhalb eines Ausdrucks verwenden. Also vom Prinzip her:

DECLARE @flag AS BIT
SET @flag = GETDATE() > '01.01.2006' -- Geht natürlich nicht!

Work-Around:

DECLARE @flag AS BIT
SET @flag = CASE WHEN GETDATE() > '01.01.2006' THEN 1 ELSE 0 END

Der Work-Around Funktioniert zwar, ist aber unglaublich viel Tipperei
und ich bin mir auch über die Performance im unklaren, wenn er als
Subexpression verwendet wird.


Reale Anwendungsfälle:

-- Statistische Auswertungen
SELECT a,b,c,
CAST(SUM(<Zeilen mit Bedingung 1>) AS FLOAT)/COUNT(*) AS 'Anteil 1',
CAST(SUM(<Zeilen mit Bedingung 2>) AS FLOAT)/COUNT(*) AS 'Anteil 2',
CAST(SUM(<Zeilen mit Bedingung 3>) AS FLOAT)/COUNT(*) AS 'Anteil 3'
FROM ...
GROUP BY a,b,c

-- XOR-Emulation, für Datenbanken, die den logischen XOR-Operator nicht
kennen (z.B. MS SQL)

SELECT *
FROM ...
WHERE <Bedingung1> + <Bedingung2> + <Bedingung3> & 1 = 1
-- entspricht <Bedingung1> XOR <Bedingung2> XOR <Bedingung3>

-- Gruppierung nach bestimmten Eigenschaften
SELECT <Bedingung 1>, <Bedingung 2>, COUNT(*)
FROM ...
GROUP BY <Bedingung 1>, <Bedingung 2>
-- der Fall liefert besonders unübersichtlichen SQL-Code, vor allem,
wenn er noch in Kombination mit obiger XOR-Emulation auftritt.


Gibt es da andere, besere Möglichkeiten?


Marcel
 #2  
23.03.2006, 09:29
Torsten Schneider
Marcel Müller <news.5.maazl> wrote:

>-- XOR-Emulation, für Datenbanken, die den logischen XOR-Operator nicht
>kennen (z.B. MS SQL)


Meines Wissens gibt es in MS SQL den Operator ^.

Wenn du dann die Variablen als boolean statt bit deklarierst, wird es
wesentlich übersichtlicher.


Grüße, Torsten
 #3  
23.03.2006, 09:52
Marcel Müller
Hallo,

Torsten Schneider schrieb:
> Marcel Müller <news.5.maazl> wrote:
>
>>-- XOR-Emulation, für Datenbanken, die den logischen XOR-Operator nicht
>>kennen (z.B. MS SQL)

>
> Meines Wissens gibt es in MS SQL den Operator ^.


Ja, richtig.
Aber das macht im gezeigten Fall nur einen marginalen Unterschied, da
auch dies ein Integer-Operator ist.

WHERE <Bedingung1> ^ <Bedingung2> ^ <Bedingung3> = 1
<Bedingung#> muss nachwievor die Form
CASE WHEN <Bedingung#> THEN 1 ELSE 0 END
haben.


> Wenn du dann die Variablen als boolean statt bit deklarierst, wird es
> wesentlich übersichtlicher.


Zumindest MSSQL muss da auch passen. Ist glaube ich ein Oracle/MySQL
feature.


Marcel
Ähnliche Themen
Problem mit Konvertierung zu integer

Hallo, wie kann man z.B. einen Wert '16,' in 16 konvertieren? cast(spalte as integer) arbeitet hier leider nicht. Die Spalte in der DB ist vom Typ varchar, es stehen aber...

Variable (integer) als Bedingung in einer SQL-Anweisung

Moin zusammen, ich möchte in eine SQL-Anweisung (Datenbasis für ein Reportaufruf) eine Variable (integer) als Bedingung einbauen. Da mir das nicht gelungen ist, habe ich als...

Konvertierung von "Integer" zu "String" in einem konstanten Ausdruck

Guten Morgen irgendwie kriege ich nicht hin ein ganz normale Konvertierung von Integer zu String in einem konstanten Ausdruck Mein Fall: Private Const intZahl As Integer =...

Konvertierung in Integer

Hallo NG, ich habe gleich noch eine Frage. Sie betrifft die zahlreichen Konvertierungsmöglichkeiten. Welche sollte man wann anwenden? Werden die VB-spezifischen Funktionen...


Alle Zeitangaben in WEZ. Es ist jetzt 03:25 Uhr. | Privacy Policy