Предполагая, что вы хотите сохранить порядок в массиве - имена перечислены в том же порядке, что и идентификаторы в оригинале 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 здесь
Связанные:
Рассматривается нормализованный дизайн БД:
Эти два выражения делают разные вещи (если 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
bool CheckFlag(FooFlag fooFlag)
{
return fooFlag == (this.Foo & fooFlag);
}
bool CheckFlag(FooFlag fooFlag)
{
return (this.Foo & fooFlag) != 0;
}
Я предпочитаю первый. Я использую! =0 экономно в булевых выражениях.
Я - положительный мыслитель:
bool CheckFlag(FooFlag fooFlag)
{
return this.Foo & fooFlag == 1;
}