2016-07-18 11 views
0

Ich muss den Wert einer bestimmten Spalte in Postgre ändern, aber ich habe noch nie mit Maskenbits gearbeitet, (es ist ein Legacy-Code). Der aktuelle Wert ist 1, aber es ist als eine ganze Zahl maskbit gespeichert, so, wenn ich versucheSetzen Sie 0 in einem Integer-Maskbit auf Postgresql

update table set field=0 where ... 

viel zu tun Es ist nicht und es hält mich zurückkehr 1. Also las ich die Dokumentation und versucht, eine zu tun ist:

update table set field=field&0 where ... 

Aber es hat nicht funktioniert auch. Dann habe ich versucht, alle 30 Bits zu decken, ohne Erfolg zu:

update table set field=field&0000000000000000000000000000000 where ... 

Kann jemand bitte zeigen Sie mir, wie man richtig den Wert einer ganzen Zahl maskbit auf postgresql ändern?

EDIT: Ich fand this case here in StackOverflow

UPDATE users SET permission = permission & ~16 

welche die gesehen, die am nächsten verminen so habe ich versucht,

UPDATE table SET field = field & ~1 

, denn das ist das einzige Bit ich aber immer noch aktiv zu deaktivieren, zu tun haben, und Neuabstimmung 1, wenn ich eine SELECT

Antwort

0

PostgreSQL kann wählerischer als Sie es gewohnt sind, wenn es um die Kombination von verschiedenen Arten kommt. Sie können nicht einfach 0 verwenden, Sie müssen eine Bitstring-Konstante der richtigen Länge verwenden oder eine ganze Zahl explizit in den richtigen bit(n)-Typ umwandeln.

Bitstring-Konstanten werden wie B'00101' eingegeben, die den Typ bit(5) haben. Einige Beispiele können Sie in psql eingeben:

select 5; 
select (5::bit(5)); 
select (30::bit(5)); 
select ~(1::bit(5)); 
select ~B'00001'; 
select (B'00101' & B'11110'); 
select (B'00101' & ~(1::bit(5))); 
+0

Ich habe mit einem Versuch, den ich tat, bearbeitet. Die Verwendung von 'UPDATE table SET field = field & ~ 1' gibt mir immer noch 1 zurück, und wenn ich versuche, es als Bit String zu verwenden, gibt postgre Fehler beim Casting in der Update-Abfrage zurück. –

+0

Sie müssen Ihre '1' auf den richtigen Bitstring-Typ wie' ~ (1 :: bit (5)) 'umsetzen, außer dass die' 5' wahrscheinlich geändert werden muss. Geben Sie '\ d Tabellenname' in psql ein um den richtigen Typ für Ihr Feld zu sehen. – NovaDenizen

+0

Nun, es ist eine ganze Zahl, so habe ich versucht, 'update Tabellensatz Feld = Feld & ~ (1 :: Bit (32)), wo ...' aber erhielt den Fehler "Operator existiert nicht: integer & Bit" Also habe ich versucht 'update Tabellensatz Feld = Feld & ~ (1 :: Bit (32)) :: integer wo ...' Welche ‚Query zurückgegeben erfolgreich zurückgegeben: eine Zeile betroffen, 166 ms Ausführung Zeit.' Aber das Feld gibt immer 1 zurück, wenn ich SELECT –

Verwandte Themen