Как я должен проверить, установлен ли флаг в перечислении флагов? [закрытый]

Предполагая, что вы хотите сохранить порядок в массиве - имена перечислены в том же порядке, что и идентификаторы в оригинале relation_ids.

Я предлагаю конструктор ARRAY поверх коррелированного подзапроса с unnest() и WITH ORDINALITY, присоединенного к таблице names, например:

SELECT r.*
    , (ARRAY (
         SELECT n.first_name
         FROM   unnest(r.relation_ids) WITH ORDINALITY AS a(user_id, ord)
         JOIN   names n ON n.user_id = a.user_id
         ORDER  BY a.ord
         )
       ) AS first_names
FROM   relations r;

Этот запрос сохраняет [ 1116] все строк из relations в любом случае.

Угловые случаи, на которые следует обратить внимание:
1. Значение NULL в relation_ids (для всего столбца) переводится в пустой массив. (Аналогично пустому массиву в источнике.)
2. NULL элементы молча удаляются из массива.

Возможно, вы захотите определить желаемое поведение, если эти угловые случаи возможны ...

db <> fiddle здесь

Связанные:

Рассматривается нормализованный дизайн БД:

6
задан Bill the Lizard 8 August 2012 в 14:47
поделиться

6 ответов

Эти два выражения делают разные вещи (если fooFlag имеет больше чем один набор битов), поэтому какой лучше, действительно зависит от поведения, которое Вы хотите:

fooFlag == (this.Foo & fooFlag) // result is true iff all bits in fooFlag are set


(this.Foo & fooFlag) != 0       // result is true if any bits in fooFlag are set
9
ответ дан 8 December 2019 в 12:24
поделиться
bool CheckFlag(FooFlag fooFlag)
{
    return fooFlag == (this.Foo & fooFlag);
}
6
ответ дан 8 December 2019 в 12:24
поделиться

я предпочитаю первый, потому что это более читаемо.

3
ответ дан 8 December 2019 в 12:24
поделиться
bool CheckFlag(FooFlag fooFlag)
{
    return (this.Foo & fooFlag) != 0;
}
2
ответ дан 8 December 2019 в 12:24
поделиться

Я предпочитаю первый. Я использую! =0 экономно в булевых выражениях.

1
ответ дан 8 December 2019 в 12:24
поделиться

Я - положительный мыслитель:

bool CheckFlag(FooFlag fooFlag)
{
  return this.Foo & fooFlag == 1;
}
-2
ответ дан 8 December 2019 в 12:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: