Veja o exemplo si te serve, adapte ele.
create table test
(id int auto_increment primary key,
edital_atual varchar(60),
edital_antigo varchar(60),
comunicado varchar(60),
contrato_atual varchar(60));
INSERT INTO `test` (`id`,`edital_atual`,`edital_antigo`,`comunicado`,`contrato_atual`) VALUES (1,'ID_1_autal','ID_1_antigo','ID_1_comunicado',NULL);
INSERT INTO `test` (`id`,`edital_atual`,`edital_antigo`,`comunicado`,`contrato_atual`) VALUES (2,NULL,NULL,NULL,NULL);
INSERT INTO `test` (`id`,`edital_atual`,`edital_antigo`,`comunicado`,`contrato_atual`) VALUES (3,NULL,NULL,NULL,'ID_3_contrato');
INSERT INTO `test` (`id`,`edital_atual`,`edital_antigo`,`comunicado`,`contrato_atual`) VALUES (4,'ID_4_atual',NULL,NULL,NULL);
INSERT INTO `test` (`id`,`edital_atual`,`edital_antigo`,`comunicado`,`contrato_atual`) VALUES (5,NULL,NULL,NULL,'ID_5_contrato');
INSERT INTO `test` (`id`,`edital_atual`,`edital_antigo`,`comunicado`,`contrato_atual`) VALUES (6,NULL,NULL,NULL,'ID_6_contrato');
create or replace view view_test as
select id,0 as ordem,'EDITAL ATUAL' as valor
from test where edital_atual is not null and length(trim(edital_atual)) >= 1
UNION ALL
select id,1 as ordem,'EDITAL ANTIGO' as valor
from test where edital_antigo is not null and length(trim(edital_antigo)) >= 1
UNION ALL
select id,2 as ordem,'COMUNICADO' as valor
from test where comunicado is not null and length(trim(comunicado)) >= 1
UNION ALL
select id,3 as ordem,'CONTRATO ATUAL' as valor
from test where contrato_atual is not null and length(trim(contrato_atual)) >= 1
;
select * from view_test order by id,ordem
resultado algo como isto
