CASE în MySQL

Funcții Toate versiunile MySQL și MariaDB

Alege o valoare în funcție de condiții, ca un if / else în interiorul interogării.

Sintaxă
CASE WHEN conditie1 THEN rezultat1 WHEN conditie2 THEN rezultat2 ELSE altfel END

Ce face CASE

CASE verifică pe rând condițiile din WHEN și returnează rezultatul primei condiții adevărate. Dacă nicio condiție nu este adevărată, returnează valoarea din ELSE (sau NULL, dacă lipsește ELSE).

Îl poți folosi în SELECT, ORDER BY, UPDATE și în funcții de grup, de exemplu ca să numeri separat mai multe categorii. Pentru o singură condiție, MySQL are și funcția mai scurtă IF(conditie, da, nu).

Exemple

Exemplele de pe această pagină pornesc de la datele de mai jos. Rulează mai întâi acest cod, apoi exemplul.

CREATE TABLE produse (
  id INT PRIMARY KEY,
  nume VARCHAR(50) NOT NULL,
  categorie VARCHAR(30),
  pret INT,
  stoc INT
);

INSERT INTO produse VALUES
  (1, 'Laptop', 'Electronice', 3500, 4),
  (2, 'Mouse', 'Electronice', 80, 25),
  (3, 'Birou', 'Mobilier', 900, 0),
  (4, 'Scaun', 'Mobilier', 650, 7),
  (5, 'Monitor', 'Electronice', 1200, 3);

Exemplul 1: Starea stocului ca text

SELECT nume, stoc,
  CASE
    WHEN stoc = 0 THEN 'epuizat'
    WHEN stoc < 5 THEN 'stoc limitat'
    ELSE 'în stoc'
  END AS stare
FROM produse;

Rezultat

+---------+------+--------------+
| nume    | stoc | stare        |
+---------+------+--------------+
| Laptop  |    4 | stoc limitat |
| Mouse   |   25 | în stoc      |
| Birou   |    0 | epuizat      |
| Scaun   |    7 | în stoc      |
| Monitor |    3 | stoc limitat |
+---------+------+--------------+

Exemplul 2: Numărare pe intervale de preț

SELECT
  SUM(CASE WHEN pret < 1000 THEN 1 ELSE 0 END) AS sub_1000,
  SUM(CASE WHEN pret >= 1000 THEN 1 ELSE 0 END) AS peste_1000
FROM produse;

Rezultat

+----------+------------+
| sub_1000 | peste_1000 |
+----------+------------+
|        3 |          2 |
+----------+------------+

Greșeli frecvente

  • Uiți END de la final și primești eroare de sintaxă.
  • Pui condițiile în ordine greșită: dacă WHEN stoc < 5 vine înaintea lui WHEN stoc = 0, produsele epuizate apar ca „stoc limitat”.

Comenzi înrudite

  • COALESCE / IFNULL: Înlocuiește NULL cu o valoare implicită: returnează prima valoare care nu este NULL.
  • SUM: Adună valorile dintr-o coloană numerică.
  • UPDATE: Modifică valorile din rândurile existente ale unui tabel.