Мне нужно работать с базой данных, которая содержит столбец change
, указывающий, каким образом были изменены три других столбца в сравнении с предыдущей соответствующей записью. Тип изменения может быть new
, removed
или changed
.Преобразование «подстроенных флагов» назад к исходному значению
Эти типы присвоены следующие номера:
column | a b c
----------+----------------------
new | 3 12 48
removed | 2 8 32
changed | 1 4 16
содержание В change
столбца является суммой всех ходатайствующих типов изменений, то есть, если столбец a
был changed
и b
removed
, то change
колонка будет 1 + 8 = 9. (Всегда есть изменение, т. Е. Может быть 1, 2 или 3 слагаемых.)
Моя проблема: я не могу придумать разумный способ преобразования этого «суммированного флага» обратно в исходное значение (часть проблемы, не зная, что делать в Google).
Я могу сказать, что если change
неровный, a
был либо new
, либо changed
; и что если change>=48
, c
было new
плюс, возможно, другие изменения, иначе change>=32
=>c
был removed
плюс, возможно, другие изменения и так далее. Возможно, я мог бы объединить это в огромный логический запрос, но я уверен, что для этого нужно разработать сложное решение.
Я использую PostgreSQL в случае, если это релевантно. В таблице содержится около 50 миллионов строк.
Большое спасибо, он работает красиво. Просто КАК вы знали использовать '&' с 3 на каждом и '>>' некоторые с 2 или 4? Попытка и ошибка? Логика? Это имеет смысл, как только вы его получили, но получить там тяжелую вещь ... – Christallkeks
Это логика. Как вы знаете, цифры умножаются на четыре для * b * по сравнению с * a *, и снова на четыре, чтобы получить случай * c *. Теперь разделение на четыре - это то же самое, что смещение 2 двоичных цифр [это то, что знают все программисты моего (старого) возраста). Оператор AND - способ извлечь определенные биты. Число 3 соответствует младшим 2 битам числа, которое может иметь значение 0-3. Это, конечно, логика, и это очень помогает, когда вы получаете доступ к двоичной системе, маскировке и смещению. – trincot
Ну ладно, я понял. Молодой программист здесь, еще многое узнать, особенно на этом абстрактном уровне. Раньше я слышал о бит-мудших операциях, но до сих пор не использовал их и не использовал. Еще раз спасибо, отличный ответ! – Christallkeks