CodeGym /Cursos /SQL SELF /Introdução às estruturas de controle: IF, CASE, RETURN

Introdução às estruturas de controle: IF, CASE, RETURN

SQL SELF
Nível 51 , Lição 0
Disponível

Estruturas de controle são a base de qualquer programa, seja um script SQL, código Python ou até um robô em Marte pensando se manda sinal pra casa ou procura vida atrás da cratera.

No PL/pgSQL, as estruturas de controle ajudam a gente a:

  • Executar certas ações se as condições forem verdadeiras.
  • Controlar a ordem de execução do código.
  • Implementar lógica de decisão.

Pode imaginar elas como placas de trânsito na estrada: "Se ver um STOP, para. Se ver o sinal verde — vai embora!"

As estruturas de controle mais populares no PL/pgSQL:

  • IF – checa uma condição e executa os comandos correspondentes.
  • CASE – alternativa ao IF quando tem muita condição.
  • RETURN – termina a execução da função e retorna o resultado.

Você já deve ter uma ideia delas. E, depois de programar em outras linguagens, entender isso aqui vai ser moleza.

Operador condicional IF

O operador IF é usado pra executar código só se uma condição for TRUE (verdadeira). Olha a estrutura básica:

IF condição THEN
  -- Código que executa se a condição for verdadeira.
ELSE
  -- Código alternativo se a condição for falsa.
END IF;

Vamos escrever uma função que recebe um número e retorna se ele é par ou ímpar:

CREATE OR REPLACE FUNCTION check_even_odd(num INTEGER)
RETURNS TEXT AS $$
BEGIN
  IF num % 2 = 0 THEN
    RETURN 'Número par';
  ELSE
    RETURN 'Número ímpar';
  END IF;
END;
$$ LANGUAGE plpgsql;

Agora vamos testar ela:

SELECT check_even_odd(4); -- Número par
SELECT check_even_odd(7); -- Número ímpar

Explicando rapidinho: IF num % 2 = 0 THEN checa se o número é divisível por 2 sem resto.

Condição ELSIF

Às vezes, uma checagem só não basta e você precisa testar várias condições. Pra isso existe o ELSIF.

Imagina que temos uma função que retorna um comentário sobre a temperatura:

CREATE OR REPLACE FUNCTION temperature_comment(temp INTEGER)
RETURNS TEXT AS $$
BEGIN
  IF temp < 0 THEN
    RETURN 'Muito frio!';
  ELSIF temp >= 0 AND temp <= 20 THEN
    RETURN 'Fresquinho';
  ELSE
    RETURN 'Quente!';
  END IF;
END;
$$ LANGUAGE plpgsql;

Testando:

SELECT temperature_comment(-5);  -- Muito frio!
SELECT temperature_comment(15);  -- Fresquinho
SELECT temperature_comment(25);  -- Quente!

Sintaxe do CASE

Se você tem um monte de condições, o operador CASE salva a pátria. Ele parece um pouco com o IF, mas é mais "elegante".

CASE
  WHEN condição_1 THEN valor_1
  WHEN condição_2 THEN valor_2
  ELSE valor_padrão
END;

Vamos criar uma função que retorna um comentário de nota baseado no número:

CREATE OR REPLACE FUNCTION grade_comment(score INTEGER)
RETURNS TEXT AS $$
BEGIN
  RETURN CASE
    WHEN score >= 90 THEN 'Excelente'
    WHEN score >= 75 THEN 'Bom'
    WHEN score >= 50 THEN 'Satisfatório'
    ELSE 'Insatisfatório'
  END;
END;
$$ LANGUAGE plpgsql;

Testando:

SELECT grade_comment(95); -- Excelente
SELECT grade_comment(80); -- Bom
SELECT grade_comment(45); -- Insatisfatório

Observação: diferente do IF, o CASE retorna um valor, então dá pra usar o operador RETURN direto dentro do CASE.

Operador RETURN

RETURN termina a execução da função e retorna um valor. Isso é super importante em funções PL/pgSQL, que precisam obrigatoriamente retornar alguma coisa (tipo texto, número, etc.).

Olha como o RETURN funciona num exemplo bem simples:

CREATE OR REPLACE FUNCTION return_example()
RETURNS TEXT AS $$
BEGIN
  RETURN 'Hello, World!';
END;
$$ LANGUAGE plpgsql;

Resultado:

SELECT return_example(); -- Hello, World!

Mas e se a gente tiver vários caminhos no código? Tipo, checando entrada de dados. Aí o RETURN vai aparecer em vários lugares da função:

CREATE OR REPLACE FUNCTION check_positive_negative(num INTEGER)
RETURNS TEXT AS $$
BEGIN
  IF num > 0 THEN
    RETURN 'Número positivo';
  ELSIF num = 0 THEN
    RETURN 'Zero';
  ELSE
    RETURN 'Número negativo';
  END IF;
END;
$$ LANGUAGE plpgsql;

Testando:

SELECT check_positive_negative(10); -- Número positivo
SELECT check_positive_negative(0);  -- Zero
SELECT check_positive_negative(-5); -- Número negativo

Erros comuns e onde pode dar ruim

  1. Esquecer o operador END: esqueceu do END CASE; ou END IF;, o PostgreSQL já vai te lembrar rapidinho que precisa fechar o bloco de código.
  2. Erros lógicos usando ELSIF: a ordem das condições importa! Uma condição mais geral (temp > 0) não pode vir antes de uma mais específica (temp > 20).
  3. Esqueceu do RETURN: em PL/pgSQL a função tem que retornar alguma coisa se você declarou RETURNS.

É isso aí. A gente viu o básico das estruturas de controle e lógica no PL/pgSQL. Esse conhecimento vai te ajudar na prática pra criar funções mais complexas! Na próxima, vamos ver loops e como usar eles.

2
Tarefa
SQL SELF, nível 51, lição 0
Bloqueado
Análise de temperatura com condições `IF` e `RETURN`
Análise de temperatura com condições `IF` e `RETURN`
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION