PDA

View Full Version : Bitmaskierung über SQL in DB2



rgw
23-11-05, 07:26
in MySQL existiert die Funktion "&", mit der festgestellt werden kann, ob ein bestimmtes Bit einer Integerzahl gesetzt ist; z.B. mit x&power(2,4)=power(2,4) kann man feststellen, ob Bit 4 gesetzt ist, wobei x eine Integerzahl ist. Gibt es in DB2 eine entsprechende Funktion bzw. wie könnte man dies anders erledigen?

Fuerchau
23-11-05, 07:33
LAND(MYVAR, X'0080') = X'0080'

rgw
23-11-05, 07:57
Mit "LAND" werden Strings verarbeitet; ich habe jedoch Integer- bzw. gezonte Zahlen. Was bedeutet in diesem Zusammenhang X'0080'?

Fuerchau
23-11-05, 08:56
mit LAND kann jedes Feld verknüpft werden.
X'....' bezeichnet eine Hex-Konstante, in diesem Fall X'0080' = Bit 4 an, alle anderen aus.
Die X-Konstante muss allerdings so lang sein, wie das zu verknüpfende Feld. Ggf. ist links also mit Nullen aufzufüllen.
Belegt dein Feld z.B. 4 Byte, so ist mit X'00000080' zu verknüpfen.

rgw
23-11-05, 09:27
vielen Dank für die Erläuterung;
aber mein SQL-Select bringt mir hier:
"Argument 1 der Funktion LAND ungültig" ...
und Argument 1 ist wie gesagt mit 20,0 numerisch gezont definiert.
Und ist Hex'0080' bei einem 2-Byte-Wort nicht Bit 8?
Oder stehe ich auf der Leitung?
Nochmals Dankeschön vorab für diese Klärung.

Fuerchau
23-11-05, 11:19
Die IBM-Speicherung speichert HIWORD, LOWORD, HIBYTE, LOBYTE und nicht wie Intel-CPU's in LOxxx, HIxxx.
Kann sein, dass LAND erst ab V5R3 auch numerische Felder erlaubt.
Du kannst aber auch mit LAND(HEX(MYFIELD), '0080') verknüpfen. Das Ganze wird dann halt als Zeichenkette betrachtet, funktioniert aber ebenso.
Probier's einfach mal mit

select HEX(MYFIELD), LAND(HEX(MYFIELD), '00000000000000000080')
from ...