Возможно ли простым и быстрым запросом оставить только не-NULL значения из разных строк?
Таблица:
id val1 val2 val3
1 1 N 2
2 3 4 N
3 N N 5
Чтобы был результат:
val1 val2 val3
1 4 2
3 N 5
Топорное решение (каждую колонку оформлять в отдельную таблицу со счётчиком ряда, и джоинить их по счетчику):
SELECT val1, val2, val3 FROM
(SELECT @rn1:=@rn1+1 AS row_number_1, val1
FROM t, (SELECT @rn1:=0) t_rn_1
ORDER BY IF(val1 IS NULL, 1, 0)
) t1
LEFT OUTER JOIN
(SELECT @rn2:=@rn2+1 AS row_number_2, val2
FROM t, (SELECT @rn2:=0) t_rn_2
ORDER BY IF(val2 IS NULL, 1, 0)
) t2 ON t1.row_number_1 = t2.row_number_2
LEFT OUTER JOIN
(SELECT @rn3:=@rn3+1 AS row_number_3, val3
FROM t, (SELECT @rn3:=0) t_rn_3
ORDER BY IF(val3 IS NULL, 1, 0)
) t3 ON t1.row_number_1 = t3.row_number_3
WHERE COALESCE(val1, val2, val3) IS NOT NULL;