46 lines
2.0 KiB
Markdown
46 lines
2.0 KiB
Markdown
# Les vues
|
||
|
||
Une vue SQL est un objet de la base de données qui représente le résultat d’une requête SQL enregistrée.
|
||
Elle se comporte comme une table virtuelle : on peut la consulter avec SELECT comme une table, mais elle ne stocke pas de données.
|
||
|
||
La définition de la vue est enregistrée dans la base, et chaque fois qu’on interroge la vue, la base réexécute la requête sous-jacente.
|
||
|
||
```sql
|
||
create or replace view holder_detail as
|
||
select h.id, h.type,
|
||
case
|
||
when type = 'PERSON' then firstname || ' ' || lastname
|
||
when type = 'COMPANY' then c.name
|
||
when type = 'BANK' then b.name
|
||
end as nom,
|
||
case
|
||
when type = 'PERSON' then age(birthdate)
|
||
when type = 'COMPANY' then age(c.created_at)
|
||
end as age
|
||
from holder h
|
||
left join person p on p.id = h.id
|
||
left join company c on c.id = h.id;
|
||
left join bank b on b.id = h.id;
|
||
```
|
||
|
||
- `case when` est une expression conditionnelle SQL qui permet de retourner une valeur différente selon qu’une condition est vraie ou fausse, un peu comme une structure if/else dans un langage de programmation.
|
||
- `as` permet de donner un nom lisible à une colonne
|
||
- la fonction `age` affiche l'age en texte en se basant sur une date
|
||
- `left join` jointure optionnelle, prend tout ce qui est à gauche `holder`. Si il n' a pas de correspondance à droite (par exemple il n' a pas de `comapny` pour le type `PERSON`) alors les colonnes correspondantes à `compant` sont vides (<NULL>).
|
||
- `||` concatener deux chaines de caractères.
|
||
|
||
```sql
|
||
create or replace view account_detail as
|
||
select a.balance,
|
||
a.balance * ah.share as balance_currency,
|
||
a.balance * ah.share / latest_exchange_rate(a.currency_code, current_date),
|
||
a.currency_code,
|
||
hd.nom
|
||
from account a
|
||
join account_holder ah on ah.account_id = a.id
|
||
join holder_detail hd on ah.holder_id = hd.id;
|
||
```
|
||
|
||
- Utilisation d'une [fonction personnalisée](banque.functions.md) `latest_exchange_rate`
|
||
- `join` utilisation d'une jointure stricte. Seules les lignes avec correspondance exacte apparaissent.
|