Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Boa tarde,
Tenho alguns campos numéricos q ao fazer uma select gostaria q retornasse uma legenda
exemplo:
-
Status: 0=Inativo / 1=Ativo
-
Condição: 1=Funcionando / 2=Em manutenção / 3=Manutenção Interna
Seria algo assim, tenho varias tabelas com estes campos... mas tenho q ficar usando replace.
Existe uma forma de criar uma função para isso? Nem q na função eu tenha que setar nome do campo, ficando assim:
-
Legenda('Status',cadastro.status)
Agradeço pela atenção Motta,
Olhando não consegui assimilar, pensei em criar uma tabela auxiliar da seguinte forma
Tab: legenda
CREATE TABLE `homol`.`legenda` (
`id` INT NOT NULL AUTO_INCREMENT ,
`campo` VARCHAR(20) NOT NULL ,
`valor` VARCHAR(10) NOT NULL ,
`result` VARCHAR(30) NOT NULL,
PRIMARY KEY (`id`),
INDEX (`campo`)
)
ai pensei em criar uma função, estarei pesquisando mais sobre colunas virtuais, mas pelo que vi não sei se seria o que preciso.Não entendi o seu problema então , tente mostrar um exemplo.
Estou ai falando o q penso...
select id, Legenda(status,1) as st, Legenda(sim,0) from tab
-- função legenda
função Legenda(campo, valor){
return select resp from legenda where campo like campo and valor like valor,
}
Em resumo, invés de usar replace eu busco em uma fun~ção Legenda que consulta em uma tabela consulta
Tabela legenda
Campo | Valor | Resp
Sim | 1 | Sim
Sim |0 |Não
Status| 1 | Ativo
Status|0 | Inativo
UF |SP | São Paulo
UF |RJ | Rio de JaneiroSeriam tabelas de contra domínio que seriam acessas por join.
Fora isto poderia ser usar Coluna Virtual ou usar um CASE.
Tabelas se usam em geral quando o domínio podem variar , por exemplo Forma de Pagamento (surgiu o PIX)
Não tendo alterações pode-se partir para CASE por exemplo.
A Coluna Virtual simplifica a geração dos SQLs
Achei uma forma
Função para pesquisa da legenda
CREATE FUNCTION legenda(scampo VARCHAR(20), svalor VARCHAR(10))
RETURNS VARCHAR(100)
DETERMINISTIC
BEGIN
DECLARE resp VARCHAR(50);
SET resp = 'N/A';
SELECT result INTO resp
FROM legenda
WHERE LOWER(campo) like LOWER(scampo) and LOWER(valor) like LOWER(svalor);
RETURN resp;Tabela de legendas
CREATE TABLE `homol`.`legenda` (
`id` INT NOT NULL AUTO_INCREMENT ,
`campo` VARCHAR(20) NOT NULL ,
`valor` VARCHAR(10) NOT NULL ,
`result` VARCHAR(30) NOT NULL,
PRIMARY KEY (`id`),
INDEX (`campo`)
)
Tabela
/monthly_2021_10/image.png.09c06afd48a7db50874fa864e0a0fd9c.png" />
Query
SELECT STATUS, legenda('EquipaSt',status) as st2 FROM equipa WHERE 1
Resultado
/monthly_2021_10/image.png.500feab3a7746a5c7e5a0f939f9eed48.png" />
Colunas virtuais talvez.
Lendo as tabelas de metadados os scripts poderiam ser gerados dinamicamente.
https://www.mysqltutorial.org/mysql-generated-columns/
https://dev.mysql.com/doc/refman/8.0/en/information-schema.html
https://stackoverflow.com/questions/24571611/mysql-alter-table-if-column-not-exists