Schön in Sqlite ist, dass Typkonvertierungen/Casting relativ selbstständig und automatisch abgehandelt wird. Es gibt jedoch Situationen, in denen es notwendig ist, festzustellen, ob z.B. die Werte in einer Textspalte numerisch sind. Eine „IsNumber“ oder „TO_NUMBER“ Funktion zum Überprüfen auf einen Zahlenwert fehlt. Wenn es um Zahlen in Textfragmenten geht kann diese Funktion „Prüfen ob Zahl“ einfach nachgebildet werden: lower(spalte) = upper(spalte). Eine weitere Prüfung kann mit abs(x) oder round(x,y) durchgeführt werden.
Die Resultate anhand von einigen Beispielen. Zugrundegelegt wird die Tabelle „table1“ mit einem Feld „f1“ (char[99]).
Der Tabelleninhalt (select * from table1):
NoNumber
1
55
66,123
66.123
01.12.2011
BitBumper123
123BitBumper
0
?
Ein Select liefert die möglichen Funktionen zur Nullbestimmung in dieser Übersicht:
select round(f1), round(f1,99), abs(f1), abs(f1)<>0, f1=0, upper(f1)=lower(f1), * from table1
RecNo |
round(f1) |
round(f1,99) |
abs(f1) |
abs(f1)<>0 |
f1=0 |
upper(f1)=lower(f1) |
f1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
NoNumber |
2 |
1 |
1 |
1 |
1 |
0 |
1 |
1 |
3 |
55 |
55 |
55 |
1 |
0 |
1 |
55 |
4 |
66 |
66 |
66 |
1 |
0 |
1 |
66,12 |
5 |
66 |
66.123 |
66.123 |
1 |
0 |
1 |
66.123 |
6 |
1 |
01.12.11 |
01.12.11 |
1 |
0 |
1 |
01.12.11 |
7 |
0 |
0 |
0 |
0 |
0 |
0 |
BitBumper123 |
8 |
123 |
123 |
123 |
1 |
0 |
0 |
123BitBumper |
9 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
10 |
0 |
0 |
0 |
0 |
0 |
1 |
? |
Eine nicht perfekte aber immerhin für viele Fälle hinreichende Variante liefert also die Kombination von upper/lower mit abs:
select f1 from table1 where (abs(f1)<>0 or f1=0) and (upper(f1)=lower(f1))
f1 |
1 |
55 |
66,12 |
66123 |
01.12.11 |
0 |
Der Datumseintrag wird als Zahl erkannt, was nicht in jedem Fall gewünscht sein dürfte.