Sqlite: Numerische Prüfungen

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.