Ajutați - pentru - sql (dml) utilizând mai multe tabele din interogare

Într-o implementare SQL, poate fi efectuată o conversie de tip implicită. De exemplu, în T-SQL când se compară sau se combină valori de tip smallint și int. datele mici sunt convertite implicit în int. Detalii despre conversia explicită și implicită a tipurilor în MS SQL Server pot fi găsite în BOL.

Un exemplu. Efectuați prețul mediu al notebook-urilor PC cu prețul mediu "pre-text".
Încercați să executați interogarea

SELECT 'Preț mediu =' + AVG (preț) FROM laptop;


va duce la un mesaj de eroare

Conversia implicită de la tipul de date varchar la bani nu este permisă. Utilizați funcția CONVERT pentru a rula această interogare.

Acest mesaj înseamnă că sistemul nu poate efectua o conversie implicită de tip varchar pentru a scrie bani. În aceste situații, conversia de tip explicită poate ajuta. În acest caz, după cum este indicat în mesajul de eroare, puteți utiliza funcția CONVERT. Cu toate acestea, această funcție nu este standardizată, prin urmare se recomandă utilizarea expresiei CAST standard pentru portabilitate. Vom începe cu asta.
Dacă rescriim interogarea noastră în formular

SELECT 'Preț mediu =' + CAST (AVG (preț) AS CHAR (15)) Din laptop;


ca rezultat, obținem ceea ce era necesar:

Prețul mediu = 1410.44


Am folosit o expresie de conversie de tip CAST explicită pentru a aduce valoarea medie a prețului la o reprezentare de șir. Sintaxa expresiei CAST este foarte simplă:

CAST (<выражение> AS <тип данных>)

Trebuie să se țină seama, în primul rând, că nu sunt posibile conversii de tip (standardul conține un tabel de conversii de date admise). În al doilea rând, rezultatul funcției CAST pentru valoarea expresiei egal cu NULL va fi, de asemenea, NULL.
Să luăm în considerare încă un exemplu. determină anul mediu de lansare a navelor din tabelul Navele. anchetă

SELECT AVG (lansat) FROM nave;


va da rezultatul în 1926. În principiu, totul este corect, tk. am primit ceea ce am cerut, ANI. Cu toate acestea, media aritmetică va fi de aproximativ 1926.2381. Aici trebuie notat că funcțiile agregate (cu excepția funcției COUNT, care întoarce întotdeauna un întreg) moștenează tipul de date al valorilor procesate. Deoarece câmpul lansat este un câmp întreg, am obținut valoarea medie cu partea fracționată aruncată (notă - nu rotunjită).
Și dacă suntem interesați de rezultat cu o anumită precizie, să spunem, până la două zecimale? Aplicarea expresiei CAST la valoarea medie nu va face nimic din motivul de mai sus. De fapt,

SELECT CAST (AVG (lansat) AS NUMERIC (6,2)) FROM nave;


va returna valoarea 1926.00. Prin urmare, CAST trebuie aplicat argumentului funcției agregate:

SELECT AVG (CAST (lansat ca NUMERIC (6,2))) FROM nave;


Rezultatul este 1926.238095. Din nou, nu asta. Motivul este că a fost efectuată o conversie de tip implicită la calcularea valorii medii. Să facem încă un pas:

SELECT CAST (AVG (CAST (lansat ca NUMERIC (6,2))) AS NUMERIC (6,2)) FROM nave;


Ca rezultat, obținem ceea ce avem nevoie - 1926.24. Cu toate acestea, această soluție pare foarte greoaie. Să facem conversia de tip implicită pentru noi:

SELECT CAST (AVG (lansat * 1.0) AS NUMERIC (6,2)) FROM nave;

Ie Am folosit un argument întreg de conversie implicită la tipul numeric exact (NUMERIC EXACT), înmulțirea cu o unitate reală, și apoi aplicate conversii de tip explicit ca rezultat funcția agregată.

Conversii de tip similar pot fi efectuate utilizând funcția CONVERT:

SELECT CONVERT (NUMERIC (6,2), AVG (lansat * 1,0)) FROM nave;

Funcția CONVERT are următoarea sintaxă:

CONVERT (<тип данных>[(<длина>)] <выражение> [ <стиль>])

Diferența principală din funcția CAST CONVERT este o funcție care permite primul format de date (de exemplu, date temporale de tip datetime) atunci când conversia acestora pentru a indica un tip de caracter și format în conversie inversă. Diferitele valori întregi ale argumentului stilului opțional se potrivesc anumitor formate. Luați în considerare următorul exemplu


Aici convertim reprezentarea șirului de dată la tipul datetime. apoi efectuați transformarea inversă pentru a demonstra rezultatul formatării. Deoarece nu este specificată valoarea argumentului de stil, se folosește valoarea implicită (0 sau 100). Ca rezultat, ajungem


Mai jos sunt câteva alte valori ale argumentului stilului și rezultatul obținut în exemplul de mai sus. Rețineți că valorile de stil mai mari de 100 au ca rezultat afișarea unui an de patru cifre.

Instrucțiunea CASE poate fi folosită într-una din cele două forme sintactice de scriere:

Forma 1
CASE <проверяемое выражение>
CÂND <сравниваемое выражение 1>
ATUNCI <возвращаемое значение 1>
...
CÂND <сравниваемое выражение N>
ATUNCI <возвращаемое значение N>
[ELSE <возвращаемое значение>]
END

A doua formă
CASE
CÂND <предикат 1>
ATUNCI <возвращаемое значение 1>
...
CÂND <предикат N>
ATUNCI <возвращаемое значение N>
[ELSE <возвращаемое значение>]
END

Cu toate că propozițiile trebuie să aibă aceeași formă sintactică, adică Nu puteți amesteca prima și a doua formă. Când se utilizează prima formă de sintaxă, condiția WHEN este îndeplinită de îndată ce valoarea expresiei testului devine egală cu valoarea expresiei specificată în clauza WHEN. Când se utilizează al doilea formular de sintaxă, condiția WHEN este îndeplinită de îndată ce predicatul este TRUE. Când condiția este îndeplinită, operatorul CASE returnează valoarea specificată în clauza corespunzătoare THEN. Dacă nu este îndeplinită niciuna dintre condițiile WHEN, se va utiliza valoarea specificată în clauza ELSE. În absența ELSE. o valoare NULL va fi returnată. Dacă sunt îndeplinite mai multe condiții, valoarea clauzei THEN a primei va fi returnată.
În exemplul de mai sus, a fost utilizată a doua formă a instrucțiunii CASE.
Rețineți că pentru testul NULL, standardul oferă o formă mai scurtă de operator - COALESCE. Acest operator are un număr arbitrar de parametri și returnează valoarea primei, alta decât NULL. Pentru doi parametri, operatorul COALESCE (A, B) este echivalent cu următoarea instrucțiune CASE.

CAZUL CÂND A NU ESTE NULL ÎNTÂMÂND ÎNTR-UN SEMN

Soluția la exemplul de mai sus, atunci când se utilizează instrucțiunea COALESCE, poate fi rescrisă după cum urmează:

SELECT DISTINCT product.model,
COALESCE (CAST (prețul ca CHAR (20)), prețul "nu este disponibil")
DE PRODUSUL STÂNGAȚI PC-ul c ON product.model = c.model
WHERE product.type = 'pc';

Utilizarea primei forme sintactice a instrucțiunii CASE poate fi demonstrată în exemplul următor. Ieșiți toate modelele de PC disponibile cu prețul. Marcați cele mai scumpe și mai ieftine modele.

SELECT DISTINCT model, pret,
CASE pret CÂND (SELECT MAX (prețul) FROM pc) THEN 'cel mai scump'
CÂND (SELECTAȚI MIN (PRETUL DE LA PC)
Comentariul END al cuvântului "Preț mediu" END
DE LA PC ORDER BY price;

Ca urmare a interogării, ajungem

Articole similare