Juli 2011 archive

GREATEST und LEAST

Manchmal hat man das Problem, dass DECODE nicht richtig passt und CASE zu aufwändig ist. .. und man will ja nicht immer neue Oracle-Funktionen selbst schreiben
Hier helfen noch die Oracle-Funktionen GREATEST und LEAST

greatest(e1[,e2] …) größter Wert der Ausdrücke
least(e1[,e2] …) kleinster Wert der Ausdrücke

bei einem Vergleich von Strings gilt:

  • greatest (‘abc’,’cbe’) = ‘cbe’
  • greatest (‘ABC’,’cbe’) = ‘cbe’
  • greteast(‘ABC’,’987′) = ‘ABC’

Die Funktionen bitte nicht mit den Gruppierfunktionen MIN und MAX verwechseln!

SQL – Like-Suche nach Wildcard-Zeichen unter Oracle

Aktuell werden auch schon teilweise REGEX-Funktionen in Datenbanken etabliert.
Oftmals reicht aber eine einfache Suche mit vorgegebenen Mustern
Select * from Mitarbeiter
where nachname like ‘H%mann‘;
Liefert Heinemann, Heynemann und auch Hoffmann
Select * from Mitarbeiter
where nachname like ‘He_nemann‘;
Liefert nur Heinemann, Heynemann
Zum ignorieren von Klein – und Großschrift kann man beides klein setzen
Select * from Mitarbeiter where lower(nachname) like lower(‘He_nemann‘);
Escape-Zeichen ermöglichen die Suche von Datensätzen, die einen eigentlichen Wildcard enthalten.
Die nachfolgende Suche liefert alle Tabelle, die auch ein “_” enthalten:
Select * from all_tables
where table_name like ‘%\_%’ ESCAPE ‘\’

Oracle, Alternative zu DECODE ist CASE

Decode ist eine einfache Funktion, in der man eine Expression beschreibt und dann fast beliebig viele Ersetzungen durchführen kann.
Leider werden die Expressions, Search und Result-Ketten aber manchmal zu komplex oder Decode mehrfach geschachtelt.
Einfacher ist es hier, direkt Case einzusetzen.

DECODE
Syntax: decode( expression , search , result [, search , result]… [, default] ) as label

select
decode(POSTLEITZAHL, 70599, ‘Stuttgart – Asemwald’, 70499, ‘Stuttgart – Bergheim’, ‘UNBEKANNT’) from ADRESSE;

 

 

CASE – Funktion, längere Schreibweise, – aber flexibler

Syntax: case when expression then result
when expression then result
when expression then result
else default
end as label

Beispiel in einer Geräteliste

select
case
when substr(name, -2)=’RH’ then ‘Router‘
when device_id between 1015544 and 1015600 then ‘MURXS’
else ‘sonstiges’
end as Zusatz
, e.* from my_cmdb_devices  e;