Usuwanie bitu z kolumny

0

Powiedzmy, że mam tabelę dokumenty, która ma pola:
id
nazwa
właściwości

W kodzie aplikacji mam z kolei dla warunków zapisywanych w tej ostatniej kolumnie listę tak zdefiniowanych stałych:

warunek1   = $01;
warunek2   = $0002; 
warunek3   = $0004; 
warunek4   = $0008; 
warunek5   = $0010;

Chciałbym stworzyć zapytanie w PostgreSql, które w kolumnie dokumenty skasuje powiedzmy warunek3, jeśli został ustawiony.

0

Możesz wrzucić przykładowy rekord z bazy, żeby zobaczyć jak to jest zapisane?

1

https://www.postgresql.org/docs/7.4/functions-math.html w szczególności bitwise AND i ewentualnie bitwise NOT
trochę teorii https://pl.wikipedia.org/wiki/Koniunkcja_(logika)

0
UPDATE dokumenty
SET właściwości = ~2 & właściwości

chyba ;)

0
Marius.Maximus napisał(a):
UPDATE dokumenty
SET właściwości = ~2 & właściwości

chyba ;)

Raczej nie.
Jeśli w bazie będzie miał np. 10 (B'1010) i rzuci na to Twoje zaklęcie
SET właściwości = ~ B'0010' & B'1010'
to co, Twoi zdaniem zostanie?
Bo ja widzę to tak, że jeśli AND będzie wykonane przed NOT, to zostanie B'1', czyli 1
A jeśli NOT będzie wykonane pierwsze, to zostanie B'0'

Wydaje mi się, że & trzeba użyć do sprawdzenia warunku. Do odwrócenia konkretnego bitu można użyć XOR, lub po prostu odjąć/dodać decymalnie.

0

Mnie zastanawia po co ludzie robią sobie krzywdę takim zapisem danych.

0

Ok. Dzięki wszystkim. Chyba mam. Szło to by mniej więcej tak:

-- wgb to wartosc gaszonego bitu zapisana w systemie dziesiętnym

update dokumenty set właściwości =
case
  when (wgb = (wgb & właściwości)) then (właściwości # wgb) 
  else właściwości 
end 

Trochę zaskoczeniem było dla mnie, że chyba trzeba dać te else właściwości bo inaczej wejdzie tam null.

1 użytkowników online, w tym zalogowanych: 0, gości: 1