Friday, December 21. 2007
Helpdesk im Mittelalter
Tuesday, December 18. 2007
Den Unterschied zwischen 2 Tabellen herausfinden
Angenommen man hat 2 Tabellen, tabelle1 und tabelle2. Beide Tabellen besitzen den gleichen Aufbau und man möchte herausfinden, wie sich die Datensätze dieser Tabellen unterscheiden. Dann geht das folgendermaßen:
SELECT 'tabelle1' Tabelle, a.* FROM (
SELECT * FROM tabelle1
MINUS
SELECT * FROM tabelle2
) a
UNION
SELECT 'tabelle2' Tabelle, b.* FROM (
SELECT * FROM tabelle2
MINUS
SELECT * FROM tabelle1
) b
Voilá. Man erhält ein Resultat der Art:
Tabelle Spalte1 ....
Tabelle1 XXX ....
Tabelle2 abc ....
Das heißt, der erste Datensatz ist in Tabelle 1 zu finden, der zweite nur in Tabelle2.
Getestet mit Oracle, in anderen SQL-Dialekten muß es eventuell angepasst werden (intersect für minus, etc...)
SELECT 'tabelle1' Tabelle, a.* FROM (
SELECT * FROM tabelle1
MINUS
SELECT * FROM tabelle2
) a
UNION
SELECT 'tabelle2' Tabelle, b.* FROM (
SELECT * FROM tabelle2
MINUS
SELECT * FROM tabelle1
) b
Voilá. Man erhält ein Resultat der Art:
Tabelle Spalte1 ....
Tabelle1 XXX ....
Tabelle2 abc ....
Das heißt, der erste Datensatz ist in Tabelle 1 zu finden, der zweite nur in Tabelle2.
Getestet mit Oracle, in anderen SQL-Dialekten muß es eventuell angepasst werden (intersect für minus, etc...)
In Oracle SQL auf Zahlenwerte testen
Aus der Reihe Spaß mit Oracle:
Manchmal kommt es vor, dass man innerhalb einer SQL-Query nur die numerischen Werte ausgeben will. Gut grundsätzlich vermeidet man sowas von Anfang an, indem man die Spalten als numerisch definiert und alle anderen Werte beim Einfügen abweist. Aber manchmal kommt es halt vor, dass man solche komischen Sachen machen muss.
CREATE TABLE tabelle(a VARCHAR2);
INSERT INTO tabelle VALUES('a');
INSERT INTO tabelle VALUES('a10');
INSERT INTO tabelle VALUES(' 10');
INSERT INTO tabelle VALUES('100');
INSERT INTO tabelle VALUES('200');
Ab Oracle 10, gibt es die Funktion regexp_like, mit der man einfach auf einen regulären Ausdruck prüfen kann. Das sollte dann in etwas so aussehen (kein Oracle 10 zur Verfügung um zu testen, dass es geht):
SELECT a FROM tabelle WHERE regexp_like(a,'^[[:digit:]]+$')
Lustig wird es aber, wenn man eine ältere Oracle Version verwendet.
Prinzipiell gibt es zwei Möglichkeiten:
So richtig zufriedenstellend finde ich die Lösung jetzt aber alle nicht.
Manchmal kommt es vor, dass man innerhalb einer SQL-Query nur die numerischen Werte ausgeben will. Gut grundsätzlich vermeidet man sowas von Anfang an, indem man die Spalten als numerisch definiert und alle anderen Werte beim Einfügen abweist. Aber manchmal kommt es halt vor, dass man solche komischen Sachen machen muss.
CREATE TABLE tabelle(a VARCHAR2);
INSERT INTO tabelle VALUES('a');
INSERT INTO tabelle VALUES('a10');
INSERT INTO tabelle VALUES(' 10');
INSERT INTO tabelle VALUES('100');
INSERT INTO tabelle VALUES('200');
Ab Oracle 10, gibt es die Funktion regexp_like, mit der man einfach auf einen regulären Ausdruck prüfen kann. Das sollte dann in etwas so aussehen (kein Oracle 10 zur Verfügung um zu testen, dass es geht):
SELECT a FROM tabelle WHERE regexp_like(a,'^[[:digit:]]+$')
Lustig wird es aber, wenn man eine ältere Oracle Version verwendet.
Prinzipiell gibt es zwei Möglichkeiten:
- man benutzt Translate:
SELECT a FROM tabelle WHERE TRANSLATE(a,' 0123456789', '#') IS NULL
(Man beachte das Leerzeichen!)
Ich habe damit jetzt eine Weile rumgespielt, aber irgendwie habe ich gerade Probleme, die Logik zu verstehen. Ich verstehe zum Beispiel nicht, warum dort ein führendes Leerzeichen stehen muß.
- man nimmt to_number(char)
Das funktioniert aus offensichtlichen Gründen nicht
Wer es nicht glaubt:
SELECT TO_NUMBER('a') FROM dual
und erfreut sich der Fehlermeldung "ORA-01722: invalid number"
- Man schreibt eine Funktion/Prozedur und testet selber auf Zahlen:
- Die offensichtliche Variante ist:
CREATE OR REPLACE FUNCTION isnumeric (p_string IN VARCHAR2)
RETURN BOOLEAN
AS
l_number NUMBER;
BEGIN
l_number := p_string;
RETURN TRUE;
EXCEPTION
WHEN OTHERS THEN
RETURN FALSE;
END;
/
Dann führt man aus
SQL> select a from tabelle where isnumeric(a);
select a from tabelle where isnumeric(a)
*
ERROR at line 1:
ORA-00920: invalid relational operator
und wundert sich warum es nicht funktioniert.
Der Grund ist, SQL kennt keinen Datentyp boolean, also kann es auch mit dem angegebenen Rückgabewert nichts anfangen.
- Man verändert die Funktion folgendermaßen:
CREATE OR REPLACE FUNCTION isnumeric (p_string IN VARCHAR2)
RETURN VARCHAR2
AS
l_number NUMBER;
BEGIN
l_number := p_string;
RETURN l_number;
EXCEPTION
WHEN OTHERS THEN
RETURN NULL;
END;
/
Jetzt gibt die Funktion halt alle Zahlen zurück oder null, wenn es keine Zahl ist.
SQL> select * from tabelle where isnumeric(a) is not null;
A
------------------------------
10
100
200
So richtig zufriedenstellend finde ich die Lösung jetzt aber alle nicht.
Monday, December 17. 2007
Google Navigation mit der Tastatur
Aus der Reihe, Google Hacks:
Google Experimental
Navigieren mit den bekannten Keys aus Vim:
j/k - hoch/runter navigieren
ENTER/o - öffnet einen Link
O - öffnet einen Link in einem neuen Fenster
/ - in die Suchbox wechseln (Suchformular fokussieren)
ESC - den Fokus von der Suchbox nehmen (Suchergebnisse fokussieren)
Und wo wir gerade bei Google sind:
iGoogle finde ich faszinierend.
Google Experimental
Navigieren mit den bekannten Keys aus Vim:
j/k - hoch/runter navigieren
ENTER/o - öffnet einen Link
O - öffnet einen Link in einem neuen Fenster
/ - in die Suchbox wechseln (Suchformular fokussieren)
ESC - den Fokus von der Suchbox nehmen (Suchergebnisse fokussieren)
Und wo wir gerade bei Google sind:
iGoogle finde ich faszinierend.
Saturday, December 15. 2007
Vaterprobleme
Vorhin in der Drogerie: Ich benötige für Justus Windeln. In der richtigen Größe kosten die Pampers in der "Normalverpackung" 8,95€ für 52 Stück. Der "Sparkarton", in dem sich 2 Normalpackungen mit je 52 Stück Windeln befinden, kostet 17,95€.
Der Drogeriekette mit dem großen R am Anfang könnte ich die Pleite an den Hals wünschen.
Kapitalisten, elende...
Der Drogeriekette mit dem großen R am Anfang könnte ich die Pleite an den Hals wünschen.
Kapitalisten, elende...
Tuesday, December 11. 2007
How NOT to use Powerpoint
Herrlich, wer kennt sie nicht, diese Powerpoint Slides?
Witzig ist auch users guide 4 min
Weitere witzige Videos auf Don McMillans mySpace Seite
via zugschlus
Monday, December 10. 2007
Das Modul für verwendete Hardware rausfinden
Man hat eine LiveCd und möchte wissen, welches Kernelmodul für eth0 zuständig ist?
~$ basename $(readlink /sys/class/net/eth0/device/driver)
pcnet32
Funktioniert natürlich auch mit Festplatten und anderen Geräten
~$ basename $(readlink /sys/class/net/eth0/device/driver)
pcnet32
Funktioniert natürlich auch mit Festplatten und anderen Geräten
Friday, December 7. 2007
Datendisaster 2007
Kroll hat die Top 10 seiner Einsätze für 2007 dokumentiert. Besonders toll fand ich den hier:
A British scientist was fed up with his hard drive squeaking, so he drilled a hole through the
casing and poured oil into the mechanics. The squeaking stopped, and so did the hard drive.
(Page 1 of 1, totaling 8 entries)
