Как объединить булевский столбец

Как я могу агрегировать некоторые кортежи, подобные этому

COL_1 | COL_2 | COL_3 | COL_4
 val  |   T   |   F   |   F
 val  |   F   |   T   |   F

с помощью функции OR и вернуть следующую таблицу?

COL_1 | COL_2 | COL_3 | COL_4
 val  |   T   |   T   |   F

Ответ 1

Просто выполните GROUP BY, используйте MAX(), чтобы вернуть T, если он доступен, иначе F.

select col_1, max(col_2), max(col_3), max(col_4)
from tablename
group by col_1

Ответ 2

Как примечание (не работает с Oracle): в PostgreSQL вы сделаете следующее:

select col_1, bool_or(col_2), bool_or(col_3), bool_or(col_4)
from tablename group by col_1 order by col_1

Ответ 3

Если COL_2 - COL_4 - это текстовые столбцы (char, varchar, varchar2, nvarchar, nvarchar2)), содержащие 'T' или 'F', тогда вы можете просто взять MAX из них, так как 'T' > 'F', т.е. 'T' появляется после 'F' в лексическом порядке.

SELECT COL_1, MAX(COL_2) AS COL_2, MAX(COL_3) AS COL_3, MAX(COL_4) AS COL_4
FROM table
GROUP BY COL_1

Объяснение: Локальная операция OR возвращает TRUE, если хотя бы один из операндов имеет значение TRUE. MAX() возвращает "T", если хотя бы одно значение "T" и в противном случае "F".


Примечание. Если булевы столбцы были объявлены как

COL_x NUMBER(1) DEFAULT 0 NOT NULL

или любого другого числового типа, тогда я бы взял MAX(ABS(col_x)), так как отрицательное значение также считается TRUE. (Если у вас есть интерфейс доступа с ComboBox, связанный с булевым, он дает значения 0 или -1.)

Ответ 4

SELECT col1 = MAX(CONVERT(tinyint, ISNULL(col1,0))) ...

Объяснение: (S) Сначала он принимает логическое значение в столбце col1, или false, если ноль. Это преобразуется в тип данных TINYINT вместо BIT, который может затем использовать агрегатную функцию MAX(), которая эффективно говорит "если есть истина, возвращать истину" в вашем GROUP BY.