Декодирование строки состояния в двоичном коде с помощью оператора case - PullRequest
1 голос
/ 28 апреля 2020

Я пытаюсь декодировать 20-битное двоичное кодированное значение состояния из системы пакетных вычислений, где каждый бит соответствует определенному состоянию хоста. Значение может иметь несколько битов состояния. Для простоты я притворюсь, что есть 4 бита состояния (на самом деле их 20) Например:

  • 0001: не принимаются вакансии; все используемые процессоры
  • 0010: не принимает задания; вся используемая память
  • 0100: не принимает задания; /tmp полный
  • 1000: не принимаются вакансии; машина заблокирована

Я пытаюсь написать что-то вроде:

select host, status, (case statement) exception from hosts
+----------+--------+-------------------+
| host     | status | exception         |
+----------+--------+-------------------+
| machine1 |   0001 | cpu               |
| machine2 |   1011 | locked,memory,cpu |
| machine3 |   1100 | locked,/tmp       |

с помощью оператора case. Я не могу понять, как построить свой оператор case, чтобы я мог объединить несколько исключений вместе.

1 Ответ

1 голос
/ 28 апреля 2020

Если тип столбца BIGINT, вы можете использовать двоичный оператор & для извлечения битов. Например:

select
  host,
  status,
  substr( 
    concat(
      case when status & 1 then ',cpu' else '' end,
      case when status & 2 then ',memory' else '' end,
      case when status & 4 then ',tmp' else '' end,
      case when status & 8 then ',locked' else '' end
    ),
  2) as exceptions
from hosts

Результат:

host      status  exceptions       
--------  ------  -----------------
machine1       1  cpu              
machine2      11  cpu,memory,locked
machine3      12  tmp,locked       

Пример данных (пример выполнения при БД Fiddle ):

create table hosts (
  host varchar(10),
  status bigint
);

insert into hosts (host, status) values ('machine1', 1);
insert into hosts (host, status) values ('machine2', 11);
insert into hosts (host, status) values ('machine3', 12);
...