SQL CASE en functies: berekende kolommen

Leer nieuwe kolommen berekenen in SQL-query's. Reken met rekenkundige operatoren en duidelijke kolomaliassen, converteer waarden naar andere gegevenstypen, schoon tekst zoals namen en e-mailadressen op en splits deze, en bereken datums, maanden, leeftijden en deadlines. Verwerk ontbrekende waarden met NULL-logica, COALESCE en NULLIF en deel rijen in categorieën in met CASE-expressies. De voorbeelden werken in SQLite en PostgreSQL. Onderweg wijzen we op verschillen die je in MySQL, SQL Server en Oracle tegenkomt.

BeginnerLes 3 van 6 in SQL: de basis

Wat je leert

  1. Bereken voor elke rij nieuwe waarden met rekenkundige operatoren en functies, geef de resultaten duidelijke namen en voorkom dat gegevenstypen de uitkomst veranderen.
    • Bereken nieuwe kolommen en geef ze namen met aliassen
      Schrijf expressies in de SELECT-lijst, geef de resultaten een naam met AS en weet waar je die namen in een query kunt gebruiken.
    • Reken met rekenkundige operatoren en numerieke functies
      Gebruik +, -, *, / en % in de juiste volgorde, voorkom verrassingen door gehele deling en rond resultaten af met ROUND en verwante functies.
    • Converteer waarden naar andere gegevenstypen
      Herken het type van elke waarde, converteer dit expliciet met CAST en herken automatische conversies die de sortering, vergelijkingen en resultaten veranderen.
  2. Voorspel wat NULL doet met berekeningen, vergelijkingen en filters en vervang of maak bewust ontbrekende waarden.
    • Voorspel hoe NULL zich gedraagt in berekeningen en voorwaarden
      Leg uit wat NULL betekent, hoe het zich door expressies verspreidt en waarom een voorwaarde met NULL waar noch onwaar is.
    • Vervang en maak ontbrekende waarden met COALESCE en NULLIF
      Vul ontbrekende waarden aan met COALESCE, zet nullen en plaatsaanduidingen om in NULL met NULLIF en kies vervangingswaarden die de betekenis van de gegevens behouden.
  3. Voeg tekstwaarden samen, schoon ze op, bepaal hun lengte en splits ze, zodat namen, e-mailadressen en codes consistent en bruikbaar worden.
    • Voeg tekstwaarden samen en schoon ze op
      Voeg tekst samen, zet letters om naar hoofdletters of kleine letters, verwijder spaties en vervang tekens. Nest deze functies om rommelige invoer op te schonen.
    • Bepaal de lengte van tekst en haal tekstdelen op
      Tel tekens, zoek waar een teken voorkomt en haal stukken tekst op met posities die bij 1 beginnen.
  4. Schrijf en lees datumwaarden correct, haal ze uit elkaar en maak ze op, en reken met dagen, maanden en tijdspannen.
    • Noteer, bewaar en lees datum- en tijdwaarden
      Ken de datum- en tijdtypen, schrijf datums in de ondubbelzinnige ISO-notatie, converteer tekst naar datums en haal de huidige datum en tijd op.
    • Haal datumonderdelen op en maak ze op
      Haal het jaar, de maand of de weekdag op, groepeer datums per periode en zet datums om in leesbare tekst.
    • Reken met datums en filter op datumbereiken
      Tel dagen en maanden op, bepaal de tijd tussen twee datums en schrijf datumfilters die elke rij binnen een periode meenemen.
  5. Zet voorwaarden met CASE om in labels, categorieën en aangepaste sorteervolgordes en combineer CASE met de andere functies in volledige rapportagequery's.
    • Deel rijen in categorieën in met CASE-expressies met voorwaarden
      Schrijf CASE WHEN … THEN … ELSE … END, zet de voorwaarden zo op volgorde dat elke rij in de juiste groep terechtkomt en verwerk grenswaarden en NULL-waarden.
    • Gebruik eenvoudige CASE-expressies en pas CASE toe op verschillende plaatsen in een query
      Zet codes om met eenvoudige CASE-expressies, maak indicatoren en aangepaste sorteervolgordes en herken de kortere vormen die andere databases bieden.
    • Combineer functies tot een volledige rapportagequery
      Bouw stap voor stap een rapport met meerdere berekende kolommen, nest functies correct en controleer elke kolom aan de hand van met de hand uitgewerkte rijen.

SQL CASE en functies: uitleg

5 hoofdstukken

1

Maak berekende kolommen met expressies en aliassen

Berekende kolommen zetten de waarden die al in een rij staan om in bruikbare antwoorden: een regelbedrag, een korting of een procentuele verandering. Duidelijke aliassen maken die resultaten leesbaar, terwijl haakjes en gegevenstypen bepalen wat SQL daadwerkelijk berekent. Je bouwt expressies in kleine stappen op, ziet waarom gehele deling een breuk kan laten verdwijnen en kiest expliciete typeconversies als de opgeslagen vorm niet bij de bewerking past.

1.1 Bereken nieuwe kolommen en geef ze namen met aliassen

Een resultaatkolom kan een waarde tonen die nergens in de tabel is opgeslagen. SQL berekent die op basis van de huidige rij. Een expressie combineert kolommen, vaste waarden, operatoren en functieaanroepen.

Bereken voor elke rij een waarde
SELECT order_id,
       quantity * unit_price AS line_total
FROM orders;

Bij hoeveelheid 3 en eenheidsprijs 12,50 toont de nieuwe kolom 37.5. Elke rij levert zijn eigen hoeveelheid en prijs. De query laat de opgeslagen kolommen ongemoeid. Een scalaire functie, zoals ROUND(unit_price, 0), geeft ook één waarde per invoerrij terug. Als je die aan de SELECT-lijst toevoegt, worden rijen niet gecombineerd. Een aggregatiefunctie zoals SUM of AVG berekent daarentegen een waarde voor een groep.

De naam na AS is een kolomalias: een kolomkop voor het resultaat. Zonder alias gebruikt SQLite de expressie als kolomkop; PostgreSQL gebruikt ?column? voor deze rekenkundige expressie. AS is optioneel, maar maakt een naam gemakkelijker te onderscheiden van een ontbrekende komma.

Kies namen en aanhalingstekens

Gebruik een eenvoudige naam zoals line_total: letters, cijfers en lage streepjes, beginnend met een letter. Een naam met een spatie of een gereserveerd woord heeft dubbele aanhalingstekens nodig: AS "Line Total" of AS "order". Enkele aanhalingstekens markeren tekstwaarden, zoals 'Boston'. MySQL accepteert voor namen ook backticks en SQL Server accepteert rechte haken.

PostgreSQL zet namen zonder aanhalingstekens om naar kleine letters: AS LineTotal levert linetotal op. Dubbele aanhalingstekens behouden de schrijfwijze in AS "LineTotal". SQLite behoudt een alias zoals je die hebt getypt. Namen in kleine letters met lage streepjes werken in beide systemen goed.

Gebruik een alias op het juiste moment

De logische volgorde is FROM, WHERE, SELECT en dan ORDER BY. De tabel wordt gekozen en rijen worden gefilterd voordat uitvoerexpressies hun aliassen krijgen. Het sorteren gebeurt daarna.

SELECT order_id,
       quantity * unit_price AS line_total
FROM orders
WHERE quantity * unit_price > 100
ORDER BY line_total DESC;

ORDER BY kan line_total gebruiken. Standaard-SQL, PostgreSQL en MySQL kunnen die nieuwe alias niet in WHERE gebruiken; herhaal daar de expressie. SQLite accepteert een alias in WHERE als uitbreiding, maar die vorm mislukt als je hem naar PostgreSQL verplaatst.

Een nieuwe alias is ook niet beschikbaar voor een andere expressie in dezelfde SELECT-lijst. Na unit_price * 1.08 AS with_tax mislukt with_tax - unit_price AS tax als de tabel geen kolom with_tax heeft. Schrijf in plaats daarvan unit_price * 1.08 - unit_price AS tax.

Onderzoek een verrassend resultaat

SELECT first_name last_name FROM customers; is geldige SQL. Het toont één kolom met voornamen met de alias last_name. Om beide kolommen op te halen, schrijf je SELECT first_name, last_name FROM customers;. Een ontbrekende komma kan dus zonder foutmelding een misleidend resultaat opleveren.

Voor een snelle controle van een expressie is geen tabel nodig: SELECT 19.99 * 3 AS total; geeft 59.97 terug in SQLite en PostgreSQL. Oracle vóór Release 23 vereist FROM DUAL voor deze query; Release 23 en later staan ook SELECT zonder FROM toe.

Belangrijkste punten

  • Een berekende kolom berekent voor elke rij een waarde zonder opgeslagen gegevens te wijzigen.
  • Een scalaire functie behoudt de rijen; een aggregatiefunctie combineert waarden binnen een groep.
  • Gebruik dubbele aanhalingstekens voor namen die aanhalingstekens nodig hebben en enkele voor tekstwaarden.
  • ORDER BY kan een uitvoeralias gebruiken; herhaal de expressie in een WHERE-clausule die ook in andere databases werkt.
  • Een nieuwe alias is elders in dezelfde SELECT-lijst niet beschikbaar.
  • Een ontbrekende komma kan de volgende kolomnaam in een alias veranderen.

1.2 Reken met rekenkundige operatoren en numerieke functies

Rekenkundige expressies zetten oorspronkelijke hoeveelheden om in bedragen, percentages en verschillen. De operatoren zijn +, -, *, / en %; modulo geeft de rest na deling.

Bepaal de rekenvolgorde

Vermenigvuldigen, delen en modulo gaan vóór optellen en aftrekken. Operatoren met dezelfde prioriteit worden van links naar rechts uitgevoerd. Zo geeft 10 + 3 * 2 de uitkomst 16, terwijl (10 + 3) * 2 de uitkomst 26 geeft.

Voor hoeveelheid 3, eenheidsprijs 12,50 en kortingspercentage 10:

quantity * unit_price * (1 - discount_pct / 100.0)

Eerst geeft 10 / 100.0 de uitkomst 0.1. De haakjes geven het betaalde deel, 0.9. Het brutobedrag is 37.5, dus het nettobedrag is 33.75. Zonder haakjes trekt quantity * unit_price * 1 - discount_pct / 100.0 de waarde 0.1 af van 37.5 en geeft 37.4.

Behoud breuken bij het delen

In SQLite, PostgreSQL en SQL Server wordt bij deling van een geheel getal door een geheel getal het deel achter de komma afgekapt in de richting van nul: 7 / 2 geeft 3 en -7 / 2 geeft -3. MySQL en Oracle geven bij / een decimaal antwoord. Maak in SQLite en PostgreSQL vóór de deling een operand decimaal: 7 / 2.0, 7 * 1.0 / 2 of CAST(7 AS REAL) / 2 geeft 3.5. Bij CAST(7 / 2 AS REAL) is het te laat en krijg je 3.0.

Bij een stijging van 80 naar 92 geeft (92 - 80) * 100.0 / 80 de uitkomst 15.0 procent. Als je het gehele verschil eerst door 80 deelt, gaat het deel achter de komma verloren. Modulo geeft de rest: 135 / 60 is 2 uur en 135 % 60 is 15 minuten. In SQLite en PostgreSQL geeft -7 % 3 de uitkomst -1; de rest volgt het teken van de linkeroperand. Oracle schrijft MOD(17, 5) in plaats van %.

Een deler nul geeft een fout in PostgreSQL en SQL Server; SQLite en MySQL geven NULL terug. Met amount / NULLIF(divisor, 0) geven deze systemen bij nul allemaal NULL terug.

Rond af of kies een geheel getal

ROUND(x, n) rondt af op n decimalen. Een lamp met een verkoopprijs van 24,00 en kosten van 15,50 heeft een winst van 8.5. ROUND((price - cost) / price * 100, 1) geeft een marge van 35.4 procent. PostgreSQL ondersteunt negatieve aantallen decimalen: ROUND(1234.5678, -2) geeft 1200; SQLite behandelt het aantal decimalen als nul en geeft 1235.0.

FunctieBetekenisVoorbeeld
ABSAfstand tot nulABS(-4.2) geeft 4.2
CEILKleinste gehele getal dat minstens even groot isCEIL(4.1) geeft 5
FLOORGrootste gehele getal dat hoogstens even groot isFLOOR(-4.1) geeft -5
TRUNCKap het deel achter de komma af in de richting van nulTRUNC(42.8) geeft 42

PostgreSQL biedt deze functies. SQLite biedt ABS; voor CEIL, FLOOR en TRUNC is een versie nodig die met wiskundige functies is gecompileerd, beschikbaar vanaf 3.35.

Stem de precisie af op de gegevens

ROUND in SQLite en ROUND voor numeric in PostgreSQL ronden waarden precies halverwege twee uitkomsten af van nul af: ROUND(-2.5) geeft -3. PostgreSQL rondt drijvendekommagetallen bij zulke waarden meestal af naar het dichtstbijzijnde even gehele getal; ROUND met twee argumenten vereist numeric, dus gebruik ROUND(CAST(x AS numeric), 2) voor een kolom met dubbele precisie.

Drijvendekommagetallen benaderen veel decimale breuken. In SQLite kan 0.1 + 0.2 = 0.3 onwaar zijn en kan ROUND(2.675, 2) de uitkomst 2.67 geven. Decimale literals in PostgreSQL gebruiken het exacte type numeric. Gebruik voor exacte geldbedragen NUMERIC/DECIMAL in PostgreSQL of gehele centen in SQLite. Een kolom als DECIMAL declareren in SQLite zorgt niet voor exacte decimale opslag. Behoud de precisie tijdens berekeningen en rond af voor de weergave.

Belangrijkste punten

  • Haakjes bepalen welke bedragen worden gecombineerd vóór vermenigvuldigen of delen.
  • Converteer een operand vóór een gehele deling; conversie van het resultaat kan verloren cijfers niet herstellen.
  • Modulo geeft een rest, zoals de overgebleven minuten na hele uren.
  • ROUND, FLOOR, CEIL en TRUNC maken verschillende keuzes bij een waarde met een deel achter de komma.
  • Afronding van drijvendekommagetallen en beschikbare numerieke functies hangen af van het type en de database.
  • Gebruik voor exacte bedragen een exact numeriek type in PostgreSQL of gehele centen in SQLite.
  • Met NULLIF kan een deler nul NULL opleveren in plaats van een fout.

1.3 Converteer waarden naar andere gegevenstypen

Het gegevenstype van een waarde beïnvloedt berekeningen, vergelijkingen en sortering. Het getal 42 verschilt van de tekst '42', ook als ze in een resultatenoverzicht hetzelfde worden weergegeven.

Converteer een waarde expliciet

Veelvoorkomende typen zijn INTEGER voor gehele getallen, NUMERIC of DECIMAL voor exacte decimalen in PostgreSQL, REAL of double precision voor benaderde getallen, TEXT of VARCHAR voor tekst en DATE, TIME, TIMESTAMP en BOOLEAN waar die worden ondersteund.

SELECT CAST('42' AS INTEGER) AS number_value,
       CAST(42 AS TEXT) AS text_value;

CAST(expression AS type) is standaard-SQL. Het eerste resultaat is een getal; het tweede is tekst. PostgreSQL accepteert ook '42'::integer. Conversie van NULL geeft nog steeds NULL.

Schrijf voor decimale deling in SQLite CAST(quantity AS REAL) / 4; schrijf in PostgreSQL CAST(quantity AS NUMERIC) / 4. Hoeveelheid 7 geeft 1.75. CAST(7 AS NUMERIC) / 2 in SQLite geeft nog steeds 3: NUMERIC laat die gehele waarde als geheel getal opgeslagen. REAL is hiervoor de geschikte conversie in SQLite.

Weet wat conversie naar een geheel getal doet
Invoer en conversieSQLitePostgreSQL
CAST(3.9 AS INTEGER)34
CAST(-3.9 AS INTEGER)-3-4
CAST('abc' AS INTEGER)0Fout

SQLite kapt het deel achter de komma af in de richting van nul. PostgreSQL rondt een numerieke waarde af op het dichtstbijzijnde gehele getal. Gebruik eerst ROUND, TRUNC, FLOOR of CEIL als de gewenste regel ertoe doet. PostgreSQL wijst tekst af die geen geldig getal is. SQLite leest een numeriek begin: '12abc' wordt 12 en '12.5' wordt 12 bij conversie naar INTEGER. Nul na een conversie in SQLite bewijst dus niet dat de oorspronkelijke tekst een geldige nul was. TRY_CAST in SQL Server geeft NULL terug bij een mislukte conversie.

Onderscheid hoeveelheden van identificatoren

Tekst wordt teken voor teken gesorteerd. De tekenreeksen '9', '10' en '100' worden gesorteerd als '10', '100', '9'. Gebruik ORDER BY CAST(code AS INTEGER) om echte numerieke hoeveelheden die als tekst zijn opgeslagen te ordenen, nadat je hebt gecontroleerd dat het geldige getallen zijn.

Een Amerikaanse postcode zoals '02134' is een identificator. Conversie geeft 2134 en laat de eerste nul weg. Ook telefoonnummers horen als tekst te worden opgeslagen: hun cijfers duiden iets aan en beschrijven geen hoeveelheid die je kunt optellen of middelen.

Herken automatische conversies

Zowel SQLite als PostgreSQL zet het getal in 'Order #' || 42 om naar tekst, met als resultaat 'Order #42'. Beide berekenen ook de literal tussen aanhalingstekens in '5' + 3 als een getal. In PostgreSQL ligt het type van die literal aanvankelijk nog open; een TEXT-kolom heeft niet dezelfde vrijheid. Als je 3 bij een TEXT-kolom optelt, mislukt dat, dus converteer de kolom expliciet.

SQLite geeft kolommen een typevoorkeur, typeaffiniteit genoemd, en kan verschillende waardetypen in één gewone kolom bewaren. typeof(42), typeof(4.2), typeof('42') en typeof(NULL) geven 'integer', 'real', 'text' en 'null'. SQLite heeft geen afzonderlijk DATE-type: CAST('2026-03-14' AS DATE) geeft 2026. Gebruik date('2026-03-14') voor de datumfuncties.

Oracle biedt TO_NUMBER, TO_CHAR en TO_DATE. TO_CHAR en TO_DATE in PostgreSQL gebruiken opmaakpatronen zoals 'MM/DD/YYYY'. CONVERT in SQL Server gebruikt een numerieke stijlcode: CONVERT(date, '03/14/2026', 101) leest de Amerikaanse datumnotatie.

Belangrijkste punten

  • CAST verandert een waarde expliciet naar een gevraagd type; NULL blijft NULL.
  • SQLite kapt bij conversie van een numerieke waarde naar een geheel getal af, terwijl PostgreSQL afrondt.
  • SQLite kan ongeldige numerieke tekst omzetten in een gedeeltelijk getal of nul.
  • Bewaar Amerikaanse postcodes en telefoonnummers als tekst om hun identificerende waarde te behouden.
  • Sorteren als tekst en sorteren als getal kunnen verschillende volgordes opleveren.
2

Verwerk ontbrekende waarden met NULL-logica en COALESCE

Een ontbrekende waarde kan een berekening veranderen en ook beïnvloeden welke rijen een filter behoudt. Om NULL te begrijpen, volg je zowel de gegevens als de voorwaarde die ze gebruikt. Je leert ontbrekende waarden onderscheiden van nul en lege tekst, volgt TRUE, FALSE en UNKNOWN door een query en kiest vervangingswaarden die de betekenis van een rapport behouden. Met COALESCE en NULLIF kun je vervolgens ontbrekende waarden aanvullen of bewust maken.

2.1 Voorspel hoe NULL zich gedraagt in berekeningen en voorwaarden

NULL geeft een ontbrekende of onbekende waarde aan. Een lege cel in het resultaat kan NULL weergeven, maar NULL is geen gewone waarde die je met = vergelijkt.

Volg een ontbrekende invoer door een expressie

Nul is een bekend getal. Lege tekst, '', is een bekende tekenreeks zonder tekens. De tekst 'N/A' is een geregistreerd label. NULL zegt dat er geen waarde beschikbaar is. Oracle behandelt lege tekst als NULL; SQLite en PostgreSQL maken er onderscheid tussen.

De meeste rekenkundige bewerkingen en functies geven een ontbrekende invoer door als NULL. Bij salaris 50.000 en bonus NULL geeft salary + bonus de uitkomst NULL. Het totaal is onbekend omdat de bonus onbekend is. Ook UPPER(NULL), ROUND(NULL, 2) en 'Ana ' || NULL geven NULL terug in SQLite en PostgreSQL.

Test rechtstreeks op NULL

bonus = NULL, bonus <> NULL en zelfs NULL = NULL leveren UNKNOWN op. Van twee ontbrekende waarden is niet bekend dat ze gelijk zijn. Gebruik bonus IS NULL of bonus IS NOT NULL. Deze tests geven altijd TRUE of FALSE terug.

SQL-voorwaarden hebben drie mogelijke resultaten: TRUE, FALSE en UNKNOWN. SQLite toont TRUE als 1, FALSE als 0 en UNKNOWN als NULL.

VoorwaardeResultaatReden
FALSE AND UNKNOWNFALSEEén onware eis sluit AND uit
TRUE AND UNKNOWNUNKNOWNDe tweede eis is onbeslist
TRUE OR UNKNOWNTRUEEén waar alternatief maakt OR waar
FALSE OR UNKNOWNUNKNOWNHet andere alternatief is onbeslist
NOT UNKNOWNUNKNOWNEen onbekende waarde omkeren maakt haar niet bekend
Begrijp welke rijen WHERE behoudt

WHERE behoudt alleen TRUE. Zowel FALSE als UNKNOWN laat de rij wegvallen. Bij bonussen van 1000, 0, NULL, 2500 en NULL behoudt WHERE bonus < 1000 alleen de nul. WHERE bonus >= 1000 behoudt 1000 en 2500. Deze filters omvatten drie rijen, geen vijf. Ook WHERE NOT (bonus < 1000) behoudt alleen de twee bekende bonussen van minstens 1000.

Hetzelfde probleem geldt voor <>. Bij de steden Boston, Denver, NULL, Boston en Austin behoudt WHERE city <> 'Boston' Denver en Austin. Neem de onbekende stad expliciet mee:

WHERE city <> 'Boston' OR city IS NULL

Dit behoudt drie rijen. NOT haalt ontbrekende waarden niet automatisch terug.

Let op bij lijsten en vergelijkingen

3 IN (1, 2, NULL) is UNKNOWN: het ontbrekende lid kan 3 zijn. Voor x NOT IN (1, 2, NULL) voldoet een overeenkomende waarde niet aan NOT IN en geeft elke niet-overeenkomende waarde UNKNOWN. In een WHERE-clausule behoudt deze vaste lijst geen rijen. Verwijder een onbedoelde NULL uit een uitsluitingslijst voordat je die gebruikt.

Gebruik a IS NOT DISTINCT FROM b voor een gelijkheidsvergelijking die twee NULL-waarden als gelijk behandelt. Het tegenovergestelde, a IS DISTINCT FROM b, is TRUE als de ene waarde NULL is en de andere niet; twee NULL-waarden zijn niet verschillend. PostgreSQL en SQLite vanaf 3.39 ondersteunen deze vormen. SQLite heeft ook IS en IS NOT; MySQL schrijft NULL-veilige gelijkheid als <=>.

De standaardplaats voor NULL bij het sorteren verschilt: SQLite zet NULL vooraan bij oplopend sorteren; PostgreSQL zet NULL achteraan. Geef de plaats aan als die ertoe doet: ORDER BY bonus DESC NULLS LAST zet bekende bonussen in aflopende volgorde en ontbrekende bonussen aan het einde.

Belangrijkste punten

  • NULL is ontbrekend of onbekend, geen nul of lege tekst.
  • Vergelijkingen met NULL geven UNKNOWN; test met IS NULL of een waarde ontbreekt.
  • WHERE behoudt alleen TRUE, dus NOT en <> halen rijen met een onbekend resultaat niet terug.
  • AND en OR kunnen een onbekende waarde alleen oplossen als de andere voorwaarde het resultaat bepaalt.
  • Een NULL in een NOT IN-lijst verhindert dat die voorwaarde TRUE wordt.
  • IS NOT DISTINCT FROM behandelt twee NULL-waarden als gelijk.
  • NULLS FIRST of NULLS LAST maakt de sorteervolgorde expliciet.

2.2 Vervang en maak ontbrekende waarden met COALESCE en NULLIF

Soms hebben ontbrekende waarden een vervangingswaarde nodig en soms moeten ze ontbreken. Die keuze maakt deel uit van de betekenis van een rapport. COALESCE vult een ontbrekende waarde aan; NULLIF maakt van een overeenkomende plaatsaanduiding een ontbrekende waarde.

Kies de eerste beschikbare waarde

COALESCE(a, b, ...) controleert van links naar rechts en geeft het eerste argument terug dat niet NULL is. Het geeft NULL terug als elk argument NULL is.

SELECT COALESCE(mobile_phone, home_phone, 'no phone') AS contact
FROM customers;

Zonder mobiel nummer en met huistelefoonnummer '555-0100' is het contactnummer '555-0100'. Als geen van beide nummers is geregistreerd, is het 'no phone'. Een bekende nul of lege tekenreeks geldt als beschikbaar: COALESCE slaat NULL over, geen waarden die leeg of onwaar lijken.

Voor de beloning geeft salary + COALESCE(bonus, 0) de uitkomst 50.000 als het salaris 50.000 is en de bonus NULL. Dit is passend als een ontbrekende bonus betekent dat er geen is betaald. Een ontbrekende productbeoordeling betekent geen beoordeling van nul; door die te vervangen zou je een slechte beoordeling verzinnen. Laat dat getal ontbreken of maak een tekstlabel voor de weergave.

Houd vervangingstypen compatibel

PostgreSQL kan de gehele waarde rating en de tekst 'not rated' niet combineren in één numeriek resultaat. Converteer de bekende beoordelingen eerst naar tekst:

COALESCE(CAST(rating AS TEXT), 'not rated')

Een beoordeling van 4 wordt weergegeven als de tekst '4'; een NULL wordt weergegeven als 'not rated'. SQLite accepteert gemengde numerieke en tekstargumenten, maar de uitvoer kan dan verschillende typen bevatten. Maak het gewenste resultaattype duidelijk als je een query tussen databases verplaatst.

COALESCE is standaard-SQL en accepteert twee of meer argumenten. De gebruikelijke alternatieven met twee argumenten zijn IFNULL in SQLite en MySQL, ISNULL in SQL Server en NVL in Oracle.

Zet een plaatsaanduiding om in NULL

NULLIF(a, b) geeft NULL terug als de argumenten gelijk zijn; anders geeft het het eerste argument terug. NULLIF(0, 0) is NULL, terwijl NULLIF(5, 0) gelijk is aan 5.

Een bruikbare expressie voor een percentage is:

orders * 100.0 / NULLIF(visits, 0) AS conversion_pct

Bij 12 orders en 300 bezoeken blijft de deler 300 en is het percentage 4.0. Bij nul bezoeken wordt de deler NULL en wordt het percentage NULL. PostgreSQL voorkomt zo een fout door deling door nul en het resultaat geeft correct aan dat het percentage niet is gedefinieerd. Dat percentage vervangen door nul zou iets anders beweren.

Schoon ontbrekende waarden op voordat je een label geeft
COALESCE(NULLIF(phone, ''), 'unknown')

De binnenste NULLIF zet een lege tekenreeks om in NULL. De buitenste COALESCE geeft vervolgens zowel een oorspronkelijke NULL als een lege tekenreeks het label 'unknown'. Een geregistreerd telefoonnummer komt er ongewijzigd doorheen.

Neem bij een optionele tweede voornaam de afsluitende spatie op binnen de vervangingswaarde:

first_name || ' ' || COALESCE(middle_name || ' ', '') || last_name

Een tweede voornaam die NULL is, voegt niets toe en geeft 'Ana Lopez'. Een tweede voornaam 'Maria' voegt 'Maria ' toe en geeft 'Ana Maria Lopez'.

Deze expressies veranderen alleen het queryresultaat. Ze laten de oorspronkelijke waarden in de tabel staan. Een filter zoals WHERE COALESCE(bonus, 0) = 0 groepeert bekende nulbonussen en ontbrekende bonussen samen, dus gebruik dit als je die twee groepen wilt hebben.

Belangrijkste punten

  • COALESCE geeft het eerste argument terug dat niet NULL is, ook als dat een bekende nul of lege tekst is.
  • Een vervangingswaarde moet de betekenis van de ontbrekende gegevens uitdrukken en een compatibel type hebben.
  • NULLIF geeft NULL terug bij gelijkheid en anders het eerste argument.
  • Gebruik NULLIF rond een deler om bij een noemer nul NULL terug te geven.
  • Schoon een plaatsaanduiding op met NULLIF voordat je met COALESCE een vervangingswaarde voor de weergave toepast.
3

Schoon tekst op, voeg tekst samen en splits tekst met tekenreeksfuncties

Tekst uit een tabel moet vaak een bruikbare vorm krijgen: een volledige naam, een consistent e-mailadres of een deel van een code. SQL kan tekenreeksen samenvoegen en opschonen, hun tekens tellen en het deel vóór of na een scheidingsteken ophalen. Je volgt de tekenposities bij elke stap en controleert hoe spaties, hoofdletters en kleine letters, en NULL het resultaat beïnvloeden. SQLite en PostgreSQL delen veel functies, maar verschillen in diverse namen en gedragingen.

3.1 Voeg tekstwaarden samen en schoon ze op

SQL behandelt een tekstwaarde als een tekenreeks. Tekstfuncties kunnen een volledige naam samenstellen of een e-mailadres opschonen voor vergelijking. Hun resultaten verschijnen in de query; opgeslagen tekst blijft ongewijzigd.

Schrijf tekst en voeg die samen

Tekstliterals gebruiken enkele aanhalingstekens. Om een apostrof op te nemen, verdubbel je die: 'O''Brien' stelt “O'Brien” voor. Een paar enkele aanhalingstekens, '', is lege tekst.

SELECT first_name || ' ' || last_name AS full_name
FROM customers;

De concatenatie-operator || voegt de onderdelen precies zoals geschreven samen. Met 'Ana' en 'Lopez' is het resultaat 'Ana Lopez'. De middelste literal levert de spatie; concatenatie voegt die niet automatisch in.

SQLite, PostgreSQL en Oracle gebruiken ||. In MySQL betekent || standaard OR, dus gebruik daar CONCAT. SQL Server gebruikt + en ondersteunt vanaf 2025 ook ||. Om een numerieke orderidentificatie samen te voegen met tekst, zetten SQLite en PostgreSQL die in 'Order #' || order_id om naar tekst. Converteer het getal eerst bij + in SQL Server: 'Order #' + CAST(order_id AS VARCHAR(10)).

Kies hoe je een ontbrekend onderdeel samenvoegt

In SQLite en PostgreSQL maakt een NULL-operand het resultaat van || NULL. Oracle behandelt dat ontbrekende onderdeel als lege tekst. Ook CONCAT verschilt per database:

DatabaseCONCAT('Ana', NULL, 'Lopez')
PostgreSQL, SQL Server, SQLite vanaf 3.44'AnaLopez'
MySQLNULL

CONCAT in Oracle gebruikt precies twee argumenten. CONCAT_WS(' ', first_name, middle_name, last_name) plaatst spaties tussen onderdelen die niet NULL zijn, dus een ontbrekende tweede voornaam geeft 'Ana Lopez'. SQLite heeft CONCAT en CONCAT_WS toegevoegd in 3.44. NULL overslaan verwijdert nog steeds geen lege tekenreeks.

Zet letters om en verwijder spaties aan de randen

UPPER('boston') geeft 'BOSTON'; LOWER zet letters om naar kleine letters. INITCAP('ana LOPEZ') in PostgreSQL geeft 'Ana Lopez'. SQLite heeft geen INITCAP en de ingebouwde omzetting verandert alleen A–Z: UPPER('é') blijft 'é' zonder de ICU-uitbreiding. De omzetting in PostgreSQL volgt de taal- en regio-instellingen.

TRIM verwijdert spaties aan beide uiteinden; LTRIM verwijdert ze alleen aan het begin en RTRIM alleen aan het einde. TRIM(' New York ') geeft 'New York' en behoudt de twee spaties binnenin. Om x aan beide uiteinden te verwijderen, schrijft SQLite TRIM('xxBostonxx', 'x'); PostgreSQL schrijft TRIM(BOTH 'x' FROM 'xxBostonxx').

Vervang tekens en nest opschoonstappen

REPLACE('555-0100', '-', '') geeft '5550100'. Het vervangt elke exacte overeenkomst. Hoofdletters en kleine letters doen ertoe: 'st' vervangen in 'Main St' verandert niets, omdat 'St' een hoofdletter S heeft.

SELECT LOWER(TRIM(email)) AS email_clean
FROM customers;

Voor ' Ana@Example.COM ' geeft TRIM eerst 'Ana@Example.COM', waarna LOWER 'ana@example.com' geeft. Nesten betekent dat de binnenste functie de invoer voor de volgende levert.

Gewone tekstgelijkheid is standaard hoofdlettergevoelig in SQLite en PostgreSQL. WHERE LOWER(TRIM(email)) = 'ana@example.com' kan invoer met andere hoofdletters en spaties aan de randen vinden. De standaard sorteerregels van MySQL negeren hoofdletters en LIKE in SQLite negeert het verschil tussen hoofdletters en kleine letters voor A–Z, hoewel de standaardvergelijking met = dat niet doet.

Belangrijkste punten

  • Gebruik enkele aanhalingstekens voor tekst en verdubbel een apostrof binnen een literal.
  • Concatenatie voegt exacte onderdelen samen; voeg scheidingstekens expliciet toe.
  • De omgang met NULL verschilt tussen ||, CONCAT en databasedialecten.
  • TRIM verwijdert spaties aan de randen, terwijl REPLACE overeenkomende tekens overal vervangt.
  • Geneste functies worden van binnen naar buiten uitgevoerd.
  • Omzetting naar hoofdletters of kleine letters en hoofdlettergevoelige vergelijkingen hangen af van de database en de taal- en regio-instellingen.

3.2 Bepaal de lengte van tekst en haal tekstdelen op

Tekstfuncties zoeken en selecteren delen van tekst op basis van tekenposities. In SQL beginnen posities bij 1, dus het eerste teken staat op positie 1. Een gevonden positie en een aantal tekens zijn verschillende invoerwaarden.

Bepaal de lengte en haal een deel van een tekenreeks op

LENGTH('Boston') geeft 6. Spaties tellen mee: LENGTH(' Bo ') geeft 4. Lege tekst heeft lengte 0; LENGTH(NULL) is NULL. LENGTH in MySQL telt bytes, dus gebruik daar CHAR_LENGTH voor tekens. SQL Server gebruikt LEN, dat spaties aan het einde negeert.

SELECT SUBSTR('Boston', 1, 3) AS beginning,
       SUBSTR('Boston', 4) AS ending;

De resultaten zijn 'Bos' en 'ton'. De eerste aanroep neemt drie tekens vanaf positie 1. De tweede laat het aantal weg en neemt alles vanaf positie 4. PostgreSQL schrijft ook SUBSTRING('Boston' FROM 4 FOR 3). SQLite accepteert de naam SUBSTRING vanaf 3.34. SQL Server gebruikt SUBSTRING(text, start, count); het aantal is verplicht tot en met 2022 en optioneel vanaf 2025.

SQLite kan vanaf rechts tellen: SUBSTR('Boston', -3) geeft 'ton'. Negatieve startposities in PostgreSQL tellen niet terug vanaf het einde. Gebruik daar RIGHT('Boston', 3); LEFT haalt tekens vanaf het begin op. SQLite heeft geen LEFT en geen RIGHT.

Zoek het splitsingspunt

INSTR(text, search) in SQLite geeft de eerste positie terug waarop een overeenkomst staat. PostgreSQL gebruikt STRPOS of POSITION(search IN text). Deze functies geven 0 terug als er geen overeenkomst is. De zoekopdracht is hoofdlettergevoelig: INSTR('Ana', 'a') is 3.

In 'ana@example.com' staat de @ op positie 4. De gebruikersnaam eindigt er vlak voor; het domein begint er vlak na:

SUBSTR(email, 1, INSTR(email, '@') - 1) AS user_name,
SUBSTR(email, INSTR(email, '@') + 1) AS domain

De eerste expressie wordt SUBSTR(email, 1, 3) en levert 'ana' op. De tweede begint op 5 en levert 'example.com' op. Als je - 1 weglaat, komt @ in de gebruikersnaam terecht. Als je + 1 weglaat, komt het teken aan het begin van het domein te staan. Vervang in PostgreSQL INSTR door STRPOS of gebruik SPLIT_PART(email, '@', 2) voor het domein.

Ga om met een ontbrekend scheidingsteken

Voor 'anaexample.com' geeft INSTR 0 terug. De domeinformule begint op 1 en geeft ten onrechte de hele tekenreeks terug. De formule voor de gebruikersnaam geeft in SQLite lege tekst; PostgreSQL wijst de negatieve lengte van de deeltekenreeks af. Beveilig het ophalen:

CASE
  WHEN INSTR(email, '@') > 0
  THEN SUBSTR(email, INSTR(email, '@') + 1)
END

Dit geeft NULL terug als het scheidingsteken ontbreekt. De controle zoekt naar een scheidingsteken en controleert niet alle regels voor een geldig e-mailadres.

Maak korte labels en codes met een vaste breedte

SUBSTR(first_name, 1, 1) || '. ' || last_name geeft 'A. Lopez' voor Ana Lopez. WHERE LENGTH(zip_code) <> 5 vindt geregistreerde Amerikaanse postcodes als tekenreeks met de verkeerde lengte; NULL-lengtes leveren UNKNOWN op en vallen weg.

LPAD('42', 5, '0') in PostgreSQL geeft '00042'; RPAD vult rechts aan. SQLite kan die code maken met SUBSTR('00000' || 42, -5). Door slechts vijf tekens te behouden, wordt een langere waarde ook afgekapt, dus deze expressie met vaste breedte vereist een code die past.

Belangrijkste punten

  • Posities in SQL-tekenreeksen beginnen bij 1; LENGTH telt spaties mee.
  • SUBSTR gebruikt een startpositie en een optioneel aantal tekens.
  • INSTR, STRPOS en POSITION geven 0 terug als er geen overeenkomst is.
  • Gebruik de positie min 1 vóór een scheidingsteken en de positie plus 1 erna.
  • Controleer of een scheidingsteken ontbreekt voordat je een deel ophaalt.
  • Tekst vanaf het einde ophalen en opvullen hebben verschillende namen in SQLite en PostgreSQL.
4

Werk met datums en tijden

Werken met datums begint met een duidelijk onderscheid tussen een kalenderdag, een tijdstip en een tijdstempel. Van daaruit kan SQL jaar-maandaanduidingen maken, deadlines berekenen, verstreken tijd bepalen en een volledige periode filteren. Je houdt datumwaarden gescheiden van tekst voor de weergave, houdt rekening met maandultimo's en verjaardagen en vergelijkt de expressies waarmee SQLite en PostgreSQL dezelfde taak uitvoeren. Grensgevallen maken deze berekeningen betrouwbaar.

4.1 Noteer, bewaar en lees datum- en tijdwaarden

Een datum is gemakkelijker om mee te rekenen als de opslag en schrijfwijze duidelijk zijn. De tekst '03/04/2026' kan 4 maart of 3 april betekenen. Een ISO-datum, '2026-03-14', zet jaar, maand en dag in een ondubbelzinnige volgorde.

Stem de waarde af op het type

PostgreSQL heeft DATE voor een kalenderdag, TIME voor een tijdstip en TIMESTAMP voor een datum en tijdstip. TIMESTAMP WITH TIME ZONE, ook timestamptz genoemd, slaat een moment op in UTC en toont het in de tijdzone van de sessie. Een gewone TIMESTAMP heeft die tijdzonebetekenis niet.

SQLite slaat datums en tijden op als ISO-tekst of als getallen, niet als afzonderlijke datum- en tijdtypen. Numerieke vormen zijn onder meer Juliaanse dagnummers en Unixtijd. De datumfuncties interpreteren deze waarden en geven een datum, tijdstip of numerieke maat terug.

Gebruik ISO-tekst met een vaste breedte zoals '2026-03-14', inclusief voorloopnullen. Voeg een tijdstip toe volgens de 24-uursklok: '2026-03-14 09:30:00'. De getypeerde literal DATE '2026-03-14' van PostgreSQL maakt expliciet een datum.

Behoud de chronologische volgorde

ISO-tekst met vaste breedte wordt in datumvolgorde vergeleken, omdat die met het grootste onderdeel begint. '2026-03-14' komt vóór '2026-11-02'. Amerikaanse tekst voor de weergave heeft deze eigenschap niet: als tekenreeksen wordt '11/02/2025' na '03/14/2026' gesorteerd, hoewel die datum eerder is.

De omzettingsfunctie van SQLite heeft de ondersteunde notatie nodig. date('2026-3-14') geeft NULL terug omdat de maand niet uit twee cijfers bestaat. De functie kan ook een onmogelijke datum normaliseren: date('2026-02-30') geeft '2026-03-02' terug. Een resultaat dat niet NULL is, bewijst op zichzelf niet dat de invoer een geldige kalenderdag was. PostgreSQL wijst DATE '2026-02-30' af.

Lees tekst in een andere notatie

PostgreSQL en Oracle gebruiken TO_DATE('03/14/2026', 'MM/DD/YYYY') om een Amerikaanse notatie te lezen. PostgreSQL leest ISO-tekst ook met CAST('2026-03-14' AS DATE) of '2026-03-14'::date.

SQLite heeft geen TO_DATE-omzettingsfunctie. Bouw voor tekst in vaste MM/DD/YYYY-notatie in d de ISO-tekst opnieuw op:

SUBSTR(d, 7, 4) || '-' ||
SUBSTR(d, 1, 2) || '-' || SUBSTR(d, 4, 2)

De onderdelen zijn het jaar '2026', de maand '03' en de dag '14'. Het resultaat is '2026-03-14', dat de datumfuncties van SQLite kunnen lezen. De posities werken alleen als de invoer daadwerkelijk de vaste notatie gebruikt.

Haal de huidige datum en tijd op

CURRENT_DATE en CURRENT_TIMESTAMP werken in SQLite en PostgreSQL. SQLite geeft UTC-tekst terug; date('now', 'localtime') geeft de lokale datum. Rond middernacht kunnen UTC en de lokale kalenderdatum verschillen.

PostgreSQL gebruikt de tijdzone van de sessie. CURRENT_TIMESTAMP en NOW() geven de begintijd van de huidige transactie weer, dus wachten binnen die transactie verandert hun waarde niet. MySQL biedt NOW() en CURDATE(); SQL Server heeft GETDATE() en SYSDATETIME(); Oracle heeft SYSDATE, inclusief een tijdstip, en CURRENT_DATE.

Gebruik om een berekening van een vervaldatum te controleren eerst een vast uitgangspunt zoals DATE '2026-10-21' in PostgreSQL of '2026-10-21' in SQLite. Je kunt het resultaat dan met een kalender vergelijken zonder dat het antwoord de volgende dag verandert.

Belangrijkste punten

  • DATE is een kalenderdag; TIMESTAMP voegt een tijdstip toe.
  • Gebruik YYYY-MM-DD met vaste breedte voor ondubbelzinnige datumtekst die in verschillende systemen werkt.
  • ISO-tekst wordt chronologisch gesorteerd als de notatie en de gebruikte tijdsbasis consistent zijn.
  • Een datumresultaat in SQLite kan een onmogelijke invoer normaliseren in plaats van afwijzen.
  • Functies voor de huidige datum hanteren verschillende regels voor tijdzones en transacties.

4.2 Haal datumonderdelen op en maak ze op

Haal een datumonderdeel op als je een jaar of weekdag nodig hebt om mee te rekenen. Maak een datum op als je tekst voor een lezer nodig hebt. Deze bewerkingen kunnen verschillende typen opleveren, ook als de weergegeven tekens er hetzelfde uitzien.

Haal een jaar, maand of weekdag op

PostgreSQL gebruikt het standaardcommando EXTRACT(part FROM value). Voor DATE '2026-03-14' geeft YEAR de uitkomst 2026 en MONTH de uitkomst 3, beide als getal. MySQL en Oracle ondersteunen EXTRACT ook.

SQLite gebruikt strftime(format, value), dat tekst teruggeeft:

SQLite-patroonResultaat voor '2026-03-14'
'%Y''2026'
'%m''03'
'%d''14'
'%w''6'

%w in SQLite en DOW in PostgreSQL nummeren de dagen van zondag als 0 tot en met zaterdag als 6. 14 maart 2026 is een zaterdag. ISODOW in PostgreSQL nummert daarentegen van maandag als 1 tot en met zondag als 7. Een weekendfilter in SQLite is WHERE strftime('%w', order_date) IN ('0', '6').

Vergelijk de juiste typen

strftime('%m', order_date) = 3 is onwaar voor een datum in maart in SQLite: de functie geeft de tekst '03' terug, niet het getal 3. Vergelijk met = '03' of converteer eerst:

CAST(strftime('%m', order_date) AS INTEGER) = 3

Dit is ook nuttig in de kwartaalexpressie (CAST(strftime('%m', d) AS INTEGER) + 2) / 3. Gehele deling geeft kwartaal 1 voor maart en kwartaal 4 voor november. PostgreSQL heeft rechtstreeks EXTRACT(QUARTER FROM d).

Duid een maand aan als volledige periode

strftime('%Y-%m', order_date) maakt in SQLite een label zoals '2026-03'. date(order_date, 'start of month') maakt '2026-03-01'. PostgreSQL kan TO_CHAR(order_date, 'YYYY-MM') gebruiken voor een label of DATE_TRUNC('month', order_date) voor het eerste moment van die maand.

Behoud het jaar in een periodelabel. Een losse maandwaarde van 3 zou maart uit verschillende jaren combineren. De waarde voor de eerste van de maand kan de waarde voor berekeningen en sortering blijven, terwijl een afzonderlijke expressie voor de weergave zorgt.

Maak op bij de uitvoer

In PostgreSQL geeft TO_CHAR(DATE '2026-03-14', 'MM/DD/YYYY') de tekst '03/14/2026' en geeft het patroon 'Mon DD, YYYY' de tekst 'Mar 14, 2026'. Oracle gebruikt deze patronen ook. De Amerikaanse notatie in SQLite is strftime('%m/%d/%Y', '2026-03-14').

Patroonletters horen bij hun database. In PostgreSQL betekent MM maand en MI minuut. In SQLite betekent %m maand en %M minuut; als je die hoofdletter verandert, verandert de gevraagde informatie.

SELECT TO_CHAR(order_date, 'MM/DD/YYYY') AS order_day
FROM orders
ORDER BY order_date;

Hier toont PostgreSQL leesbare tekst, maar sorteert het op de werkelijke datums. Sorteren op order_day zou de weergegeven tekenreeksen eerst op maand sorteren en datums uit verschillende jaren in de verkeerde volgorde kunnen zetten.

Belangrijkste punten

  • EXTRACT in PostgreSQL geeft numerieke onderdelen terug; strftime in SQLite geeft tekst terug.
  • Vergelijk een SQLite-maand met voorloopnul met tekst of converteer die naar een getal.
  • De nummering van weekdagen hangt af van de gekozen conventie.
  • Behoud het jaar in jaar-maandaanduidingen en maak alleen op voor de weergave.

4.3 Reken met datums en filter op datumbereiken

Bij kalenderberekeningen moet je rekening houden met maandlengtes, tijdsonderdelen en het soort antwoord dat nodig is. Een aantal dagen, een kalendermaand en een voltooid levensjaar zijn verschillende maten.

Tel dagen en kalendermaanden op

PostgreSQL schrijft DATE '2026-03-14' + 30; SQLite schrijft date('2026-03-14', '+30 days'). Beide komen uit op 13 april: na 17 dagen is maart voorbij en de overige 13 dagen brengen je op 13 april. De rechtstreekse expressie '2026-03-14' + 30 van SQLite geeft daarentegen 2056, omdat de rekenkundige bewerking het jaartal aan het begin als getal leest.

Voor het einde van de maand is een expliciete regel nodig. DATE '2026-01-31' + INTERVAL '1 month' in PostgreSQL geeft 28 februari om middernacht, met de laatste beschikbare dag. date('2026-01-31', '+1 month') in SQLite telt overtollige dagen door in maart en geeft '2026-03-03'. Voeg vanaf SQLite 3.46 na de verschuiving 'floor' toe om '2026-02-28' te kiezen. ADD_MONTHS in Oracle verschuift ook naar de laatste dag van de kortere maand.

Bepaal de verstreken tijd

Aftrekken van DATE-waarden in PostgreSQL geeft hele dagen terug: DATE '2026-04-13' - DATE '2026-03-14' is 30. SQLite trekt numerieke dagwaarden af: julianday('2026-04-13') - julianday('2026-03-14') is 30.0. SQL Server gebruikt DATEDIFF(day, start, end); MySQL gebruikt DATEDIFF(end, start).

Voor tijdstempels van 14 maart om 09:30 tot 18:00 geeft aftrekken in PostgreSQL een interval van 08:30:00; EXTRACT(EPOCH FROM interval) / 3600 drukt dit uit als 8,5 uur. Vanaf SQLite 3.38 kun je schrijven:

(unixepoch('2026-03-14 18:00') -
 unixepoch('2026-03-14 09:30')) / 3600.0

Dit geeft 8.5. Een verschil tussen Juliaanse dagnummers vermenigvuldigd met 24 kan 8.49999999627471 geven door benadering met drijvendekommagetallen; rond de weergave af. Een tijdsduur tussen tijdstempels die een deel achter de komma bevat, moet je niet naar INTEGER converteren voordat de gewenste eenheid is berekend.

Tel voltooide verjaardagen

Iemand die op 2 november 1990 is geboren, is op 21 oktober 2026 35 jaar. De jaartallen verschillen 36, maar de verjaardag is nog niet geweest. PostgreSQL gebruikt EXTRACT(YEAR FROM AGE(DATE '2026-10-21', DATE '1990-11-02')), met als resultaat 35.

SQLite trekt er één af als de verjaardag dit jaar nog moet komen:

strftime('%Y', '2026-10-21') - strftime('%Y', birth_date)
- (strftime('%m-%d', '2026-10-21') < strftime('%m-%d', birth_date))

De vergelijking levert 1 op als de verjaardag nog moet komen en anders 0. Verstreken dagen delen door 365 is onbetrouwbaar: op 1 november 2026 heeft deze persoon 13.148 dagen geleefd, wat gedeeld door 365 de uitkomst 36,02 geeft, hoewel de 36e verjaardag morgen is. DATEDIFF in SQL Server telt grenzen: van 31 december naar 1 januari gaan telt als een jaargrens, niet als een voltooid levensjaar.

Neem elke tijdstempel in een periode mee

BETWEEN sluit beide grenspunten in. Voor DATE-kolommen omvat 1 maart tot en met 31 maart heel maart. Voor tijdstempels betekent een bovengrens van '2026-03-31' middernacht aan het begin van de laatste dag, waardoor de rest van die dag ontbreekt.

WHERE ordered_at >= '2026-03-01'
  AND ordered_at < '2026-04-01'

Dit halfopen bereik sluit het begin in en het begin van de volgende periode uit. Zo valt elk tijdstip in maart binnen het bereik zonder een laatste fractie van een seconde te kiezen.

Achterstallige datums voldoen aan due_date < CURRENT_DATE. De ondergrens voor de afgelopen 30 dagen is CURRENT_DATE - 30 in PostgreSQL en date('now', '-30 days') in SQLite. De dagen tot een deadline zijn due_date - CURRENT_DATE voor DATE-waarden in PostgreSQL en julianday(due_date) - julianday(date('now')) in SQLite.

Belangrijkste punten

  • Gebruik datumrekenfuncties of getypeerde datums, geen rekenkundige bewerkingen op datumtekst in SQLite.
  • Bepaal hoe je bij het optellen van een maand omgaat met een dag die in de volgende maand ontbreekt.
  • Verschillen tussen DATE-waarden tellen dagen; verschillen tussen tijdstempels kunnen delen van dagen bevatten.
  • Leeftijd telt voltooide verjaardagen, geen verstreken dagen gedeeld door 365.
  • Een halfopen bereik voor tijdstempels sluit het begin van de periode in en het volgende begin uit.
  • Gebruik een huidige waarde met alleen een datum voor deadlineberekeningen in hele dagen.
5

Deel rijen in categorieën in met CASE-expressies

Een rapport heeft vaak een regel nodig die gegevens omzet in een label of bedrag: een kleine order, een nog te verzenden zending of een prioriteitsvolgnummer. CASE drukt die keuze uit binnen een query. Je volgt welke voorwaarde wint, plaatst exacte grenzen en ontbrekende waarden in de juiste categorie en zet codes om met een eenvoudige CASE-expressie. Het eindrapport combineert indeling in categorieën met rekenkundige bewerkingen, tekst, datums en vervangingswaarden en controleert elke uitvoer aan de hand van bekende rijen.

5.1 Deel rijen in categorieën in met CASE-expressies met voorwaarden

Een CASE-expressie kiest voor elke rij één resultaat. Je kunt die gebruiken om een prijsklasse een label te geven, kosten te berekenen of een record te markeren dat aandacht nodig heeft.

Lees de vorm met voorwaarden
CASE
  WHEN total < 50 THEN 'small'
  WHEN total < 200 THEN 'medium'
  ELSE 'large'
END AS size_band

Elke WHEN bevat een voorwaarde en THEN bevat de waarde die wordt teruggegeven als die voorwaarde TRUE is. De database controleert van boven naar beneden en neemt de eerste voorwaarde die waar is. END sluit de expressie af; daarna kan een alias volgen. Als geen voorwaarde TRUE is en ELSE ontbreekt, is het resultaat NULL.

Een totaal van 35 voldoet aan de eerste voorwaarde en wordt 'small'. Een totaal van 50 voldoet niet aan de eerste maar wel aan de tweede en wordt 'medium'. Hetzelfde geldt voor 199,99. Een totaal van 200 komt bij ELSE en wordt 'large'.

Stem volgorde en grenzen af op de regel

De tweede tak heeft geen total >= 50 nodig: een waarde onder 50 is al door de eerste tak teruggegeven. Oplopende grenswaarden met < werken omdat eerdere takken de kleinere waarden wegnemen. Aflopende grenswaarden met >= kunnen om dezelfde reden werken.

Als je WHEN total < 200 eerst zet, wordt een latere tak met < 50 onbereikbaar. Een totaal van 35 voldoet al aan < 200 en stopt daar dus. CASE kiest niet de meest specifieke voorwaarde en controleert niet welk label het beste klinkt.

Vergelijk de bedrijfsregel met elk grenspunt. < 50 plaatst precies 50 in de middelste klasse; <= 50 plaatst die waarde in de kleine klasse. Controleer 49,99, 50, 199,99 en 200 om beide kanten en de grenzen te bekijken. Als voorwaarden als expliciete intervallen zijn geschreven, laat de grenspunten dan aansluiten zonder tussenruimte of onbedoelde overlap.

Verwerk NULL vóór gewone bereiken

Een NULL-totaal maakt beide vergelijkingen UNKNOWN. In de eerste expressie komt het daarom bij ELSE terecht en wordt het 'large', wat misleidend is. Vang een ontbrekende waarde eerst op:

CASE
  WHEN total IS NULL THEN 'unknown'
  WHEN total < 50 THEN 'small'
  WHEN total < 200 THEN 'medium'
  ELSE 'large'
END

ELSE betekent “geen voorwaarde was waar” en kan dus zowel ontbrekende invoer als bekende waarden buiten de geteste bereiken opvangen.

Geef een consistent soort waarde terug

PostgreSQL heeft compatibele THEN- en ELSE-typen nodig. CASE WHEN quantity > 0 THEN unit_price ELSE 'n/a' END mislukt als unit_price numeriek is, omdat 'n/a' niet in een getal kan worden omgezet. Gebruik NULL voor een niet-beschikbaar numeriek resultaat, of converteer de prijs naar tekst als de hele uitvoer een weergavelabel is. SQLite staat gemengde resultaattypen toe, wat latere berekeningen kan bemoeilijken.

Een voorwaarde kan kolommen combineren:

CASE
  WHEN country = 'US' AND subtotal >= 100 THEN 0
  ELSE 7.99
END AS shipping_fee

De teruggegeven kosten kunnen voorkomen in subtotal + CASE ... END AS amount_due. Een CASE is een waarde-expressie, geen opdracht die meerdere kolommen wijzigt; elke resultaatkolom heeft een eigen expressie nodig.

CASE kan ook een deling per rij afschermen: CASE WHEN visits = 0 THEN NULL ELSE orders * 100.0 / visits END. Een rij met nul kiest de NULL-tak. orders * 100.0 / NULLIF(visits, 0) drukt dezelfde regel voor een ontbrekend percentage korter uit.

Belangrijkste punten

  • CASE geeft de waarde terug van de eerste voorwaarde die TRUE is.
  • Zet overlappende bereikvoorwaarden zo op volgorde dat een brede test een smallere niet verbergt.
  • Kies < of <= om een exacte grens in de bedoelde klasse te plaatsen.
  • Test vóór een bereik expliciet op NULL als ELSE die waarde geen label moet geven.
  • Houd resultaattypen compatibel en gebruik CASE overal waar een waarde-expressie past.

5.2 Gebruik eenvoudige CASE-expressies en pas CASE toe op verschillende plaatsen in een query

De eenvoudige CASE-expressie zet de ene waarde om in een andere. Een CASE-expressie met voorwaarden test voorwaarden; een eenvoudige CASE vergelijkt dezelfde expressie met een reeks waarden.

Zet codes om met een eenvoudige CASE
CASE status
  WHEN 'S' THEN 'Shipped'
  WHEN 'P' THEN 'Pending'
  WHEN 'C' THEN 'Canceled'
  ELSE 'Other'
END AS status_label

De impliciete tests zijn status = 'S', daarna status = 'P' en daarna status = 'C'. Een status buiten deze codes krijgt 'Other'. De vorm met voorwaarden kan dezelfde gelijkheidstests expliciet schrijven. Kies een CASE met voorwaarden voor bereiken, LIKE-patronen, NULL-tests of voorwaarden over meerdere kolommen.

CASE region WHEN NULL THEN 'missing' ELSE region END kan een NULL-regio niet opvangen. De impliciete vergelijking region = NULL is UNKNOWN, dus de rij komt bij ELSE en blijft NULL. Schrijf CASE WHEN region IS NULL THEN 'missing' ELSE region END.

Ken een aangepast sorteervolgnummer toe

De alfabetische prioriteitsvolgorde is high, low, medium. Om op urgentie te sorteren, zet je de labels om in getallen:

SELECT ticket_id, priority
FROM tickets
ORDER BY CASE priority
           WHEN 'high' THEN 1
           WHEN 'medium' THEN 2
           WHEN 'low' THEN 3
           ELSE 4
         END;

De oplopende volgorde plaatst nu high vóór medium en medium vóór low, met andere of ontbrekende waarden achteraan. De CASE is een sorteerexpressie en hoeft geen weergegeven kolom te zijn. DESC zou de numerieke rangschikking omkeren.

Maak een numerieke indicator
CASE WHEN discount_pct > 0 THEN 1 ELSE 0 END AS is_discounted

Een positief percentage krijgt 1; een bekende nul krijgt 0. Een NULL-percentage krijgt ook 0 omdat > 0 UNKNOWN is en ELSE dit opvangt. Deze indicator betekent dus “er is een positieve korting geregistreerd”. Hij behoudt het onderscheid tussen geen korting en een onbekende korting niet. Als dat onderscheid nodig is, voeg dan een IS NULL-tak met een eigen resultaat toe.

Je kunt indicatoren selecteren, sorteren, filteren of in berekeningen opnemen. Herhaal in een WHERE-clausule die ook in andere databases werkt de expressie of gebruik de oorspronkelijke voorwaarde in plaats van naar een nieuw gedefinieerde uitvoeralias te verwijzen.

Herken verwante voorwaardelijke functies

COALESCE(bonus, 0) is een korte vorm van CASE WHEN bonus IS NOT NULL THEN bonus ELSE 0 END. NULLIF(a, b) komt overeen met CASE WHEN a = b THEN NULL ELSE a END. Hun namen maken deze gebruikelijke doelen direct duidelijk.

SQLite vanaf 3.32 en SQL Server hebben IIF(condition, true_value, false_value); MySQL heeft IF. DECODE in Oracle zet gelijke waarden om, bijvoorbeeld DECODE(status, 'S', 'Shipped', 'P', 'Pending', 'Other'). DECODE behandelt twee NULL-waarden als gelijk, anders dan de gelijkheidsvergelijkingen in een eenvoudige CASE. Standaard-CASE werkt in al deze systemen.

Een CASE kan een andere CASE bevatten, maar gecombineerde voorwaarden maken een enkele expressie vaak duidelijker. Een verzendregel kan rechtstreeks WHEN country = 'US' AND subtotal >= 100 THEN 0 bevatten, zodat de tests voor land en subtotaal bij elkaar blijven.

Belangrijkste punten

  • Een eenvoudige CASE vergelijkt één expressie met waarden op gelijkheid.
  • Gebruik een CASE met voorwaarden voor NULL-tests, bereiken en gecombineerde voorwaarden.
  • Een numerieke CASE in ORDER BY maakt een aangepaste rangschikking.
  • Een indicator met ELSE 0 kent ook nul toe als de voorwaarde UNKNOWN is.
  • COALESCE en NULLIF drukken veelvoorkomende bijzondere gevallen van CASE uit.
  • DECODE in Oracle behandelt twee NULL-waarden als gelijk; een eenvoudige CASE doet dat niet.

5.3 Combineer functies tot een volledige rapportagequery

Een rapport kan in één SELECT namen opschonen, nettototalen berekenen, maanden aanduiden en de verzendsnelheid een label geven. Bouw elke expressie op vanuit de invoer en controleer het resultaat voordat je haar met de andere combineert.

Werk met bekende rijen

Een ordertabel bevat deze records. Datums zijn ISO-tekst voor de SQLite-query hieronder; quantity is een geheel getal en unit_price is numeriek.

OrderKlantHoeveelheidPrijsKorting %BesteldVerzonden
1001Ana Lopez312,50102026-03-142026-03-17
1002Ben Okafor1240,0002026-03-30NULL
1003Chen Wu124,25NULL2026-04-022026-04-03

Hier betekent een ontbrekende korting dat er geen korting is. Begin met het ophalen van de oorspronkelijke velden. Voeg telkens één berekende kolom toe en gebruik LIMIT 5 om een kleine steekproef te controleren.

Volg een geneste berekening
ROUND(quantity * unit_price *
      (1 - COALESCE(discount_pct, 0) / 100.0), 2)

COALESCE levert eerst een bekende korting. Delen door 100.0 behoudt het deel achter de komma. Aftrekken van 1 geeft het betaalde deel, vermenigvuldiging geeft het nettobedrag en ROUND bepaalt de uiteindelijke precisie. Ana's bedrag is 33,75, dat van Ben is 240,0 en dat van Chen is 51,0. De NULL-korting van Chen wordt nul; een ontbrekende verzenddatum moet daarentegen ontbreken in het aantal dagen.

Stel het SQLite-rapport samen
SELECT order_id,
       first_name || ' ' || last_name AS customer,
       ROUND(quantity * unit_price *
         (1 - COALESCE(discount_pct, 0) / 100.0), 2) AS net_total,
       strftime('%Y-%m', order_date) AS order_month,
       CAST(julianday(shipped_date) - julianday(order_date)
         AS INTEGER) AS days_to_ship,
       CASE
         WHEN shipped_date IS NULL THEN 'not shipped'
         -- fast = shipped within 2 days
         WHEN julianday(shipped_date) - julianday(order_date) <= 2
           THEN 'fast'
         ELSE 'standard'
       END AS shipping
FROM orders
ORDER BY order_id;

Elke expressie heeft een duidelijke uitvoeralias. Het numerieke dagverschil wordt naar INTEGER geconverteerd omdat dit waarden met alleen een datum zijn. De IS NULL-tak komt vóór de vergelijking van de snelheid, zodat een niet-verzonden order een bruikbaar label krijgt.

De uitvoer is:

OrderKlantNettototaalMaandDagenVerzending
1001Ana Lopez33,752026-033standard
1002Ben Okafor240,02026-03NULLnot shipped
1003Chen Wu51,02026-041fast
Pas typen en queryclausules aan

Gebruik voor DATE-kolommen in PostgreSQL TO_CHAR(order_date, 'YYYY-MM') voor de maand en shipped_date - order_date voor het aantal dagen en de CASE-vergelijking. Houd unit_price als exact numeric voor ROUND met twee argumenten. De concatenatie, vervangingswaarde voor korting en indelingsregel behouden dezelfde betekenis.

Om in beide databases te filteren op afgeronde totalen boven 50, herhaal je de volledige netto-expressie in WHERE. Orders 1002 en 1003 blijven over. SQLite staat ook WHERE net_total > 50 toe, maar PostgreSQL kan die nieuwe alias tijdens het filteren niet zien. ORDER BY net_total DESC werkt in beide.

Controleer bij het verplaatsen van een rapport de typen en functienamen in elke expressie. Een tekstfunctie moet tekst ontvangen, een datumberekening moet een ondersteunde datumwaarde ontvangen en een numerieke vervangingswaarde moet de bedoelde regel uitdrukken. Zet elke uitvoer op een eigen regel; een kort commentaar kan een bedrijfsgrenswaarde definiëren zonder de SQL onduidelijk te maken.

Belangrijkste punten

  • Bouw en controleer telkens één berekende kolom op een kleine steekproef.
  • Geneste functies geven hun resultaten naar buiten door; zorg dat elk invoertype geschikt is.
  • Een ontbrekende korting en een ontbrekende verzenddatum kunnen een verschillende behandeling vereisen.
  • Gebruik datumexpressies die bij het dialect passen en houd de rapportregels consistent.
  • Filter waar passend met de volledige expressie en sorteer met de uitvoeralias.

SQL CASE en functies: voorbeelden

5 Walkthroughs

1

Bereken en controleer een regelbedrag na korting

16 stappen
Bereken een bedrag, geef het een naam, behoud het deel achter de komma en controleer de typen achter het resultaat.
  1. 1
    IntroductieMaak van één rij een bruikbaar bedrag

    Een orderregel bevat acht artikelen van elk 7,50 met 20 procent korting. Het rapport heeft een nettobedrag nodig, maar de tabel slaat alleen de invoerwaarden op. Je bouwt de expressie in stappen op, geeft de uitvoer een naam en controleert wat gehele deling met de korting doet.

    De voorbeelden gebruiken SQLite en PostgreSQL. Waar hun typeregels verschillen, geeft de databasenaam aan bij welk systeem het resultaat hoort.

  2. 2
    UitlegBegin met een expressie

    Een expressie combineert waarden om een andere waarde op te leveren. Hier gebruikt quantity * unit_price twee kolommen uit de huidige rij.

    SELECT quantity * unit_price AS gross_total
    FROM order_lines;
    

    gross_total is de uitvoeralias. Voor de voorbeeldrij is de nieuwe waarde 60.0 in SQLite. Elke andere rij levert zijn eigen invoerwaarden; de query schrijft deze totalen niet terug naar de tabel.

  3. 3
    VerbandBij elke rij blijft één waarde horen

    Een scalaire functie geeft één waarde terug voor elke invoerrij. ROUND(unit_price, 0) verandert de weergegeven prijs voor een rij, terwijl UPPER(item_name) de weergegeven tekst verandert.

    Deze functies combineren de orderregels niet. Een aggregatiefunctie zoals SUM combineert wel waarden binnen een groep en beantwoordt dus een ander soort vraag. Een berekening in SELECT kan het detail van afzonderlijke orders behouden.

  4. 4
    TipGeef het resultaat een duidelijke naam

    AS net_total is een eenvoudige, leesbare alias. Gebruik dubbele aanhalingstekens als een naam een spatie bevat, zoals in AS "Net Total". Enkele aanhalingstekens duiden daarentegen tekstwaarden aan.

    Houd een komma tussen uitvoerexpressies. SELECT quantity unit_price geeft één kolom met hoeveelheden terug onder de kolomkop unit_price: zonder komma wordt de tweede naam een alias. Die query kan slagen en toch minder kolommen tonen dan bedoeld.

  5. 5
    UitdagingPlaats de alias in de query

    De tabel heeft alleen quantity en unit_price. Een query definieert quantity * unit_price AS gross_total. Kan een WHERE-filter in PostgreSQL gross_total > 50 gebruiken en kan ORDER BY gross_total DESC gebruiken?

    ---reveal---

    WHERE kan die nieuwe alias niet zien omdat het logisch vóór SELECT komt. Herhaal quantity * unit_price > 50. ORDER BY volgt op SELECT en kan gross_total DESC gebruiken. SQLite staat de alias in WHERE toe als uitbreiding, maar PostgreSQL niet.

  6. 6
    VoorbeeldZet een korting om in het betaalde deel

    Het brutobedrag is 8 * 7.50, oftewel 60. Na 20 procent korting blijft 80 procent te betalen over. Druk dat uit als 1 - discount_pct / 100.0.

    quantity * unit_price * (1 - discount_pct / 100.0)
    

    De deling geeft 0.2; de haakjes geven 0.8; vermenigvuldigen geeft een nettobedrag van 48.0. De haakjes houden de aftrekking bij elkaar als vermenigvuldigingsfactor.

  7. 7
    KernpuntEen latere decimale waarde kan een eerdere deling niet herstellen

    Stel dat discount_pct een geheel getal is en de deler als 100 wordt geschreven. SQLite en PostgreSQL berekenen 20 / 100 als gehele deling en krijgen 0. De vermenigvuldigingsfactor wordt 1, dus het nettobedrag blijft ten onrechte 60.

    De decimale prijs elders herstelt die binnenste deling niet. Gebruik 100.0 in de deling zelf. Het voltooide quotiënt achteraf converteren verandert het type, maar kan het ontbrekende deel achter de komma niet herstellen.

  8. 8
    UitdagingZoek de berekening die het deel achter de komma verloor

    Een SQLite-rij heeft het gehele getal completed = 9 en het gehele getal assigned = 12. Wat geeft completed / assigned * 100.0 terug en hoe moet de expressie het percentage wel berekenen?

    ---reveal---

    De expressie geeft 0.0 terug: de gehele deling 9 / 12 wordt eerst 0. Schrijf completed * 100.0 / assigned, wat 75.0 geeft. De conversie moet vóór de deling plaatsvinden, niet pas vóór de uiteindelijke weergave.

  9. 9
    UitlegKies de regel voor gehele getallen

    ROUND kiest een nabijgelegen afgeronde waarde. FLOOR gaat omlaag naar een geheel getal, CEIL gaat omhoog en TRUNC kapt het deel achter de komma af in de richting van nul.

    Voor -6.4 geeft FLOOR -7, terwijl CEIL en TRUNC -6 geven. De richting is van belang bij negatieve invoer. PostgreSQL biedt deze functies; voor CEIL, FLOOR en TRUNC in SQLite is een versie nodig die met wiskundige functies is gecompileerd. ABS, dat de afstand tot nul geeft, is ingebouwd in SQLite.

  10. 10
    TipControleer het getaltype voordat je afrondt

    In PostgreSQL gebruikt ROUND met twee argumenten numeric, geen double precision. Schrijf voor een drijvendekommakolom ROUND(CAST(amount AS numeric), 2). SQLite accepteert zijn eigen numerieke ROUND-vorm.

    Benaderde drijvendekommagetallen kunnen verrassende uitkomsten geven bij waarden halverwege twee afrondingsuitkomsten. Voor exacte bedragen slaan NUMERIC/DECIMAL in PostgreSQL exacte decimalen op; SQLite kan hele centen als gehele getallen bewaren. Rond het weergegeven resultaat af na de berekening.

  11. 11
    UitlegMaak een typewijziging expliciet

    CAST(expression AS type) vraagt om een conversie. De tekst '28' kan het gehele getal 28 worden met CAST('28' AS INTEGER). Het getal kan tekst worden met CAST(28 AS TEXT).

    Voor een deling met een deel achter de komma heeft SQLite REAL nodig om betrouwbaar een niet-gehele operand te krijgen. CAST(7 AS NUMERIC) kan daar nog steeds het gehele getal 7 zijn. NUMERIC in PostgreSQL geeft een exact decimaal type. Een CAST van NULL blijft NULL.

  12. 12
    VoorbeeldHoud identificatoren gescheiden van hoeveelheden

    Stel dat een label de Amerikaanse postcode '00421' bevat. Conversie naar een geheel getal geeft 421, waarbij de voorloopnullen verloren gaan. Het is een identificator, dus ermee rekenen is niet de bedoeling.

    Een tekstkolom die werkelijk hoeveelheden bevat, moet mogelijk worden geconverteerd om numeriek te sorteren. De tekstwaarden '12', '3' en '80' worden in die volgorde gesorteerd; numeriek sorteren geeft 3, 12, 80. Kies de conversie op basis van de betekenis van de kolom.

  13. 13
    UitdagingInterpreteer een conversie zonder die als validatie te vertrouwen

    SQLite voert CAST('31units' AS INTEGER) met succes uit. Welke waarde geeft dit terug en laat het succes zien dat de oorspronkelijke tekst een geldig geheel getal was?

    ---reveal---

    De functie geeft 31 terug door het numerieke begin te lezen. Het succes valideert niet de hele tekenreeks. PostgreSQL wijst dezelfde tekst af als geheel getal. SQLite kan ook tekst zonder numeriek begin in nul omzetten en zo ongeldige invoer verhullen.

  14. 14
    KernpuntConversie naar een geheel getal werkt niet overal hetzelfde

    Voor de numerieke waarde 4.7 kapt CAST(... AS INTEGER) in SQLite af naar 4, terwijl PostgreSQL afrondt naar 5. Als een rapport “hele eenheden die deze waarde niet overschrijden” bedoelt, druk dat dan vóór de conversie uit met FLOOR.

    Ook een impliciete conversie is databasespecifiek. PostgreSQL kan in een berekening een getal afleiden uit een literal tussen aanhalingstekens, maar een TEXT-kolom heeft een expliciete conversie nodig. De zichtbare tekens alleen bepalen het type van de operand niet.

  15. 15
    UitdagingControleer de volledige netto-expressie

    Voor acht artikelen van 7,50 met het gehele getal discount_pct = 20 gebruikt een rapport ROUND(quantity * unit_price * (1 - discount_pct / 100.0), 2) AS net_total. Wat is het resultaat en kan die alias de uitvoer sorteren?

    ---reveal---

    Het brutobedrag is 60, het betaalde deel is 0,8 en het nettobedrag is 48.0 in SQLite. ORDER BY net_total is geldig in zowel SQLite als PostgreSQL omdat sorteren de SELECT-alias kan zien.

  16. 16
    SamenvattingLees de invoer, berekening en uitvoernaam

    Een berekend bedrag volgt een pad: de rij levert waarden, rekenkundige bewerkingen en functies leveren het resultaat en een alias geeft het een naam. Controleer de volgorde van de bewerkingen en de typen van de operanden voordat je een weergegeven getal accepteert.

    Bekijk bij een onverwacht resultaat eerst een binnenste deling of conversie. Om in verschillende databases op een berekende waarde te filteren, herhaal je de expressie in WHERE; om erop te sorteren, gebruik je de uitvoeralias in ORDER BY.

2

Volg ontbrekende gegevens door een query

12 stappen
Volg UNKNOWN-voorwaarden en kies en combineer vervolgens COALESCE en NULLIF.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieEen ontbrekend bedrag verandert meer dan een cel
  2. 2
    UitlegNULL is een onbekende invoer
  3. 3
    VoorbeeldGebruik een test die controleert of een waarde ontbreekt
  4. 4
    KernpuntWHERE accepteert alleen TRUE
  5. 5
    UitdagingCombineer een bekende voorwaarde met een onbekende
  6. 6
    TipLaat geen NULL in een uitsluitingslijst staan
  7. 7
    UitlegKies een vervangingswaarde op basis van de betekenis
  8. 8
    VoorbeeldHoud het weergavetype consistent
  9. 9
    VoorbeeldMaak van een noemer nul een ontbrekende waarde
  10. 10
    UitdagingSchoon lege tekst op vóór het label
  11. 11
    UitdagingOnderscheid een weergavekeuze van een filterkeuze
  12. 12
    SamenvattingHoud de betekenis van een ontbrekende waarde zichtbaar
3

Schoon een naam op en haal een e-maildomein op

14 stappen
Voeg tekst samen, nest opschoonfuncties en volg tekenposities rond een scheidingsteken.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieMaak tekst bruikbaar zonder de onderdelen te verliezen
  2. 2
    VoorbeeldVoeg de spatie tussen namen toe
  3. 3
    UitlegBepaal wat een ontbrekend naamdeel doet
  4. 4
    VoorbeeldSchoon het e-mailadres van binnen naar buiten op
  5. 5
    UitdagingKies tussen spaties verwijderen en vervangen
  6. 6
    TipControleer teken- en dialectregels
  7. 7
    UitlegTel vanaf één
  8. 8
    VoorbeeldZoek het scheidingsteken
  9. 9
    VoorbeeldHaal de tekens vóór en na @ op
  10. 10
    UitdagingZoek het resultaat met een positieverschil van één
  11. 11
    KernpuntEen zoekresultaat nul heeft een eigen aanpak nodig
  12. 12
    TipHaal eindstukken op en vul codes aan in het juiste dialect
  13. 13
    UitdagingCombineer opschonen met ophalen
  14. 14
    SamenvattingVolg de exacte tekens
4

Maak datumlabels en betrouwbare periodefilters

18 stappen
Lees datumwaarden, maak ze op voor weergave en bereken deadlines, tijdsduren en volledige perioden.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieHoud de kalenderwaarde gescheiden van het label
  2. 2
    UitlegKies een duidelijke datumweergave
  3. 3
    VoorbeeldLees een vaste lokale notatie
  4. 4
    UitdagingLeg uit welke tekst op datum sorteert
  5. 5
    TipControleer de datumverwerking en de tijdsbasis van de huidige datum
  6. 6
    VoorbeeldHaal de maand op met het juiste retourtype
  7. 7
    UitlegBehoud het jaar in de jaar-maandaanduiding
  8. 8
    VoorbeeldMaak een weergave zonder de sortering te veranderen
  9. 9
    UitdagingBepaal het juiste kwartaal
  10. 10
    VerbandKies de conventie voor de nummering van weekdagen
  11. 11
    VoorbeeldTel tien dagen bij de boeking op
  12. 12
    KernpuntEén maand is geen vast aantal dagen
  13. 13
    VoorbeeldBepaal dagen en uren in geschikte eenheden
  14. 14
    UitdagingNeem de laatste middag van de maand mee
  15. 15
    UitlegTel verjaardagen die daadwerkelijk zijn geweest
  16. 16
    TipLees relatieve datums als verschuivende grenzen
  17. 17
    UitdagingCombineer een deadline met een maandselectie
  18. 18
    SamenvattingControleer type, kalenderregel en grenspunten
5

Geef orders een label en bouw het eindrapport

17 stappen
Kies CASE-takken, zet prioriteiten om en combineer meerdere berekende uitvoerwaarden.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieGeef elke order een bruikbaar label
  2. 2
    UitlegKies de eerste ware voorwaarde
  3. 3
    VoorbeeldVolg de exacte grens
  4. 4
    KernpuntELSE kan ook een onbekend bedrag opvangen
  5. 5
    UitdagingHerstel een verborgen kleine klasse
  6. 6
    TipGeef compatibele resultaten terug
  7. 7
    VoorbeeldZet één statuswaarde om
  8. 8
    UitdagingWaarom mist WHEN NULL de rij?
  9. 9
    VoorbeeldSorteer prioriteit op volgnummer
  10. 10
    KernpuntEen indicator kan bekende en onbekende gevallen samenvoegen
  11. 11
    VoorbeeldBegin het rapport met bekende invoer
  12. 12
    VoorbeeldBereken eerst het nettobedrag
  13. 13
    VoorbeeldVoeg datums toe met een afzonderlijke regel voor ontbrekende waarden
  14. 14
    UitdagingControleer een tweede rij aan de hand van beide regels
  15. 15
    VerbandZet de datumexpressies om naar PostgreSQL
  16. 16
    UitdagingFilter op het bedrag dat het rapport daadwerkelijk toont
  17. 17
    SamenvattingControleer het rapport als een reeks expliciete keuzes

SQL CASE en functies: oefenvragen

40 Oefenvragen in 4 sets

Set 1: Bereken bedragen en verwerk ontbrekende gegevens10 Oefenvragen

Vraag 1 van 10

Een tabel in PostgreSQL heeft alleen units en unit_cost. Welke SELECT-lijst geeft hun product terug met de kolomkop extended_cost?
  1. units + unit_cost AS extended_cost
  2. units * unit_cost AS extended_cost
  3. units * unit_cost, extended_cost
  4. units * 'unit_cost' AS extended_cost
Toon antwoordVerberg antwoord
Antwoord: B
units * unit_cost vermenigvuldigt de waarden uit elke rij en AS extended_cost geeft die uitvoer een naam. Een komma vóór de naam vraagt om een afzonderlijke kolom, die deze tabel niet heeft. Enkele aanhalingstekens zouden van unit_cost een tekstliteral maken in plaats van een verwijzing naar de kostenkolom.

Vraag 2 van 10

De tabel lines bevat alleen units en price. Een query moet in SQLite en PostgreSQL werken. Hoe moet de query rijen met een product boven 90 behouden en het grootste product eerst sorteren?
  1. SELECT units * price AS amount FROM lines WHERE amount > 90 ORDER BY amount DESC;
  2. SELECT units * price AS amount FROM lines WHERE units * price > 90 ORDER BY amount ASC;
  3. SELECT units * price AS amount FROM lines ORDER BY amount DESC WHERE units * price > 90;
  4. SELECT units * price AS amount FROM lines WHERE units * price > 90 ORDER BY amount DESC;
Toon antwoordVerberg antwoord
Antwoord: D
Herhaal units * price in WHERE omdat PostgreSQL in die fase geen nieuwe SELECT-alias kan gebruiken. ORDER BY komt logisch na SELECT en kan de alias dus met DESC sorteren. SQLite kan de alias in WHERE accepteren, maar die versie voldoet niet aan de eis dat de query in beide databases werkt.

Vraag 3 van 10

Wat geeft SELECT 14 + 5 * 3; terug in SQLite?
  1. 29
  2. 57
  3. 33
  4. 75
Toon antwoordVerberg antwoord
Antwoord: A
Vermenigvuldigen gebeurt vóór optellen, dus SQL berekent eerst 5 * 3 als 15 en telt daar 14 bij op om 29 te krijgen. Het resultaat 57 ontstaat als je eerst 14 en 5 optelt. Die volgorde vereist haakjes rond 14 + 5; de getoonde expressie heeft die niet.

Vraag 4 van 10

In SQLite zijn old_count en new_count gehele getallen met de waarden 60 en 69. Wat is het resultaat van (new_count - old_count) / old_count * 100?
  1. 15
  2. 0.15
  3. 0
  4. 9
Toon antwoordVerberg antwoord
Antwoord: C
De aftrekking geeft het gehele getal 9 en 9 / 60 is een gehele deling, die vóór vermenigvuldiging met 100 de uitkomst 0 oplevert. Het bedoelde percentage is 15, maar de expressie verliest eerst het deel achter de komma. Met (new_count - old_count) * 100.0 / old_count blijft de benodigde decimale berekening behouden.

Vraag 5 van 10

Een factuurregel in SQLite heeft de gehele getallen units = 5 en discount_pct = 12, met price = 18.0. Welk resultaat levert ROUND(units * price * (1 - discount_pct / 100), 2) op?
  1. 79.2
  2. 90.0
  3. 89.88
  4. 78.0
Toon antwoordVerberg antwoord
Antwoord: B
De binnenste deling 12 / 100 gebruikt twee gehele getallen, dus SQLite kapt de uitkomst af naar 0. De vermenigvuldigingsfactor wordt 1 en ROUND ontvangt het volledige bedrag, 5 * 18.0, met als resultaat 90,0. Voor het bedrag na korting van 79,2 is een decimale operand binnen die deling nodig; achteraf afronden kan het verloren deel achter de komma niet herstellen.

Vraag 6 van 10

Wat geeft SQLite terug voor CAST('27boxes' AS INTEGER)?
  1. 27
  2. 0
  3. Een foutmelding voor een ongeldig geheel getal
  4. NULL
Toon antwoordVerberg antwoord
Antwoord: A
SQLite converteert het langste begin dat op een geheel getal lijkt, dus de eerste cijfers leveren 27 op. Het geeft alleen 0 terug als er geen bruikbaar numeriek begin is. Een foutmelding voor een ongeldig geheel getal is het gedrag van PostgreSQL bij deze tekst, dus dezelfde conversie heeft een andere uitkomst in de twee systemen.

Vraag 7 van 10

Welke voorwaarde vindt rijen zonder geregistreerde delivery_date?
  1. delivery_date = NULL
  2. delivery_date <> NULL
  3. delivery_date = ''
  4. delivery_date IS NULL
Toon antwoordVerberg antwoord
Antwoord: D
IS NULL test rechtstreeks of een waarde ontbreekt en geeft een duidelijke TRUE of FALSE terug. Gelijkheid met NULL levert zelfs voor een ontbrekende leverdatum UNKNOWN op, zodat WHERE zulke rijen niet zou behouden. Lege tekst is een geregistreerde tekenreeks in SQLite en PostgreSQL, niet de markering voor een onbekende datum.

Vraag 8 van 10

Een tabel bevat precies vier region-waarden: 'East', 'West', NULL en 'North'. Hoeveel rijen voldoen aan WHERE NOT (region = 'East')?
  1. 3
  2. 2
  3. 1
  4. 4
Toon antwoordVerberg antwoord
Antwoord: B
De vergelijkingen voor West en North zijn FALSE, dus NOT maakt die voorwaarden TRUE en behoudt twee rijen. De vergelijking met NULL is UNKNOWN en blijft UNKNOWN na ontkenning, zodat die rij wegvalt. Als je elke rij behalve East telt, behandel je een ontbrekende regio ten onrechte als een bekende andere regio.

Vraag 9 van 10

Een lege telefoontekenreeks en NULL moeten beide als 'unlisted' worden weergegeven in SQLite. Welke expressie doet dit en behoudt geregistreerde nummers?
  1. NULLIF(COALESCE(phone, ''), 'unlisted')
  2. COALESCE(phone, '', 'unlisted')
  3. COALESCE(NULLIF(phone, ''), 'unlisted')
  4. COALESCE(NULLIF(phone, 'unlisted'), '')
Toon antwoordVerberg antwoord
Antwoord: C
De binnenste NULLIF verandert een lege telefoontekenreeks in NULL en COALESCE levert vervolgens het weergavelabel voor beide soorten ontbrekende waarden. Een niet-leeg nummer komt ongewijzigd door beide aanroepen. COALESCE(phone, '', 'unlisted') laat lege tekst ongemoeid en kiest die zelfs als vervangingswaarde voordat het label wordt bereikt.

Vraag 10 van 10

Een rapport in PostgreSQL heeft de gehele getallen sales en visits. Een percentage moet een deel achter de komma behouden en NULL blijven als visits nul is. Het mag geen percentage nul verzinnen. Welke expressie past?
  1. COALESCE(sales * 100.0 / NULLIF(visits, 0), 0)
  2. sales / NULLIF(visits, 0) * 100.0
  3. sales * 100.0 / COALESCE(visits, 1)
  4. sales * 100.0 / NULLIF(visits, 0)
Toon antwoordVerberg antwoord
Antwoord: D
Vermenigvuldiging met 100,0 maakt het percentage vóór de deling decimaal en NULLIF verandert een deler nul in NULL. Het resultaat blijft dan ontbreken bij nul bezoeken. Als je eerst de gehele aantallen deelt, kan een werkelijk deel achter de komma verloren gaan, terwijl een buitenste COALESCE naar nul een ongedefinieerd percentage ten onrechte een numerieke waarde geeft.
Set 2: Schoon tekst op en werk met kalenderwaarden10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Wat geeft LOWER(TRIM(' RAE@Mail.COM ')) terug in SQLite?
  1. ' rae@mail.com '
  2. 'RAE@Mail.COM' (hoofdletters behouden)
  3. 'rae@mail.com'
  4. 'rae@mail.com '
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

Een rij in SQLite 3.44+ heeft first_name = 'Mira', middle_name = NULL en last_name = 'Shah'. Wat geven first_name || ' ' || middle_name || ' ' || last_name en CONCAT_WS(' ', first_name, middle_name, last_name) in die volgorde terug?
  1. NULL; 'Mira Shah'
  2. 'Mira Shah'; 'Mira Shah'
  3. NULL; NULL
  4. 'Mira Shah'; 'Mira Shah'
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

Wat geeft SUBSTR('Seattle', 3, 3) terug in SQLite?
  1. 'attl'
  2. 'tle'
  3. 'eat'
  4. 'att'
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

In PostgreSQL kan een TEXT-kolom email NULL of tekst zonder @ bevatten. Geef voor tekst met @ alles na de eerste @ terug en anders NULL. Welke expressie past?
  1. CASE WHEN STRPOS(email, '@') > 0 THEN SUBSTR(email, STRPOS(email, '@')) END
  2. CASE WHEN STRPOS(email, '@') > 0 THEN SUBSTR(email, STRPOS(email, '@') + 1) END
  3. CASE WHEN STRPOS(email, '@') >= 0 THEN SUBSTR(email, STRPOS(email, '@') + 1) END
  4. CASE WHEN email IS NOT NULL THEN SUBSTR(email, STRPOS(email, '@') + 1) END
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

Welke ISO-datumtekst stelt 6 november 2027 voor?
  1. '2027-11-06'
  2. '11/06/2027'
  3. '2027-06-11'
  4. '2027-11-6'
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Wat geeft de huidige versie van SQLite terug voor date('2027-04-31')?
  1. '2027-04-30'
  2. Een foutmelding voor een ongeldige datum
  3. '2027-05-01'
  4. NULL
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

In SQLite bevat d de waarde '2027-08-19'. Wat zijn de resultaten van strftime('%m', d) = 8 en CAST(strftime('%m', d) AS INTEGER) = 8, in die volgorde?
  1. TRUE; TRUE
  2. FALSE; TRUE
  3. FALSE; FALSE
  4. TRUE; FALSE
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

Een DATE-kolom event_date in PostgreSQL omvat meerdere jaren. Een rapport geeft datums weer als MM/DD/YYYY en moet de chronologische volgorde behouden. Hoe moet het de kolom selecteren en sorteren?
  1. SELECT TO_CHAR(event_date, 'MM/DD/YYYY') AS day_label FROM events ORDER BY day_label;
  2. SELECT TO_CHAR(event_date, 'MM/DD/YYYY') AS day_label FROM events ORDER BY EXTRACT(MONTH FROM event_date), EXTRACT(DAY FROM event_date);
  3. SELECT TO_CHAR(event_date, 'MM/DD/YYYY') AS day_label FROM events ORDER BY CAST(TO_CHAR(event_date, 'MM/DD/YYYY') AS TEXT);
  4. SELECT TO_CHAR(event_date, 'MM/DD/YYYY') AS day_label FROM events ORDER BY event_date;
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Een datum d in SQLite is '2027-04-24'. Wat geeft date(d, '+10 days') terug?
  1. '2027-05-03'
  2. '2027-04-34'
  3. '2027-05-04'
  4. '2027-05-05'
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

Een TIMESTAMP-kolom in PostgreSQL heeft geen tijdzone en bevat tijdstippen uit heel juni 2027. Welk filter neemt elke waarde uit juni en geen waarde uit juli mee?
  1. logged_at >= '2027-06-01' AND logged_at < '2027-07-01'
  2. logged_at BETWEEN '2027-06-01' AND '2027-06-30'
  3. logged_at >= '2027-06-01' AND logged_at <= '2027-07-01'
  4. logged_at > '2027-06-01' AND logged_at < '2027-07-01'
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Set 3: Deel rijen in categorieën in en onderzoek rapportlogica10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Welk label levert deze CASE op voor score = 75: CASE WHEN score < 60 THEN 'review' WHEN score < 80 THEN 'ready' ELSE 'strong' END?
  1. 'review'
  2. 'strong'
  3. NULL
  4. 'ready'
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

Waarom geeft CASE WHEN amount < 500 THEN 'regular' WHEN amount < 100 THEN 'small' ELSE 'large' END nooit 'small' terug voor bedragen die niet NULL zijn?
  1. CASE controleert het laatste passende bereik eerst.
  2. Elk bedrag onder 100 voldoet al aan de eerdere test voor onder 500.
  3. De ELSE-tak gaat boven een later passend bereik.
  4. De tweede voorwaarde wordt alleen getest voor bedragen gelijk aan 500.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

Een numerieke balance kan NULL zijn. De vereiste labels zijn 'unknown' bij een ontbrekende waarde, 'credit' onder 0, 'settled' bij 0 en 'due' boven 0. Welke CASE voldoet aan alle regels?
  1. CASE WHEN balance < 0 THEN 'credit' WHEN balance = 0 THEN 'settled' ELSE 'due' END
  2. CASE WHEN balance IS NULL THEN 'unknown' WHEN balance <= 0 THEN 'credit' WHEN balance = 0 THEN 'settled' ELSE 'due' END
  3. CASE WHEN balance IS NULL THEN 'unknown' WHEN balance < 0 THEN 'credit' WHEN balance = 0 THEN 'settled' ELSE 'due' END
  4. CASE balance WHEN NULL THEN 'unknown' WHEN 0 THEN 'settled' ELSE 'due' END
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

Een state-waarde 'H' betekent vastgehouden en 'R' betekent vrijgegeven. Wat geeft CASE state WHEN 'H' THEN 'held' WHEN 'R' THEN 'released' ELSE 'other' END terug voor 'R'?
  1. 'released'
  2. 'held'
  3. 'other'
  4. NULL
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

Een rapport moet 'urgent', 'normal' en 'deferred' in die volgorde sorteren, met alle andere prioriteiten en NULL-prioriteiten achteraan. Welke ORDER BY-expressie past?
  1. CASE priority WHEN 'urgent' THEN 1 WHEN 'normal' THEN 2 ELSE 3 END DESC
  2. CASE priority WHEN 'urgent' THEN 1 WHEN 'normal' THEN 2 WHEN 'deferred' THEN 3 ELSE 4 END DESC
  3. CASE priority WHEN 'urgent' THEN 1 WHEN 'normal' THEN 3 WHEN 'deferred' THEN 2 ELSE 4 END ASC
  4. CASE priority WHEN 'urgent' THEN 1 WHEN 'normal' THEN 2 WHEN 'deferred' THEN 3 ELSE 4 END ASC
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Een rij in SQLite heeft qty = 4, price = 15.0, discount_pct = NULL en shipped_date = NULL. Een ontbrekende korting betekent dat er geen korting is. Welk paar komt uit ROUND(qty * price * (1 - COALESCE(discount_pct, 0) / 100.0), 2) en CASE WHEN shipped_date IS NULL THEN 'open' ELSE 'sent' END?
  1. NULL; 'open'
  2. 0.0; 'open'
  3. 60.0; 'open'
  4. 60.0; 'sent'
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

Een rapport in SQLite toont LOWER(TRIM(customer)) AS name en date(due_date, '+7 days') AS reminder_date. De oorspronkelijke customer is ' IVAN ' en due_date is '2027-09-26'. Welk uitvoerpaar moet een steekproefcontrole opleveren?
  1. 'ivan'; '2027-10-03'
  2. ' ivan '; '2027-10-03'
  3. 'ivan'; '2027-10-02'
  4. 'IVAN' (hoofdletters behouden); '2027-10-03'
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

Een tabel in PostgreSQL bevat de x-waarden 2, 7, NULL en 11. Wat zijn de aantallen rijen voor respectievelijk WHERE x NOT IN (2, NULL) en WHERE x <> 2 OR x IS NULL?
  1. 2 en 3
  2. 0 en 3
  3. 0 en 2
  4. 3 en 3
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Iemand is geboren op '1998-12-18'. Wat is de leeftijd in voltooide jaren op '2027-12-17' en waarom kan het aftrekken van de twee jaartallen verkeerd zijn?
  1. 28; de verjaardag is in 2027 nog niet geweest.
  2. 29; bij een nieuw kalenderjaar is een levensjaar voltooid.
  3. 28; geboorten in december tellen altijd één jaar minder.
  4. 29; verstreken dagen gedeeld door 365 geven de leeftijd.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

Een INTEGER-kolom rating in PostgreSQL kan NULL zijn. Een weergavekolom moet de beoordeling als tekst of als 'unrated' tonen. Welke expressie past?
  1. CAST(COALESCE(rating, 'unrated') AS TEXT)
  2. NULLIF(CAST(rating AS TEXT), 'unrated')
  3. COALESCE(CAST(rating AS TEXT), 'unrated')
  4. CAST(NULLIF(rating, 0) AS TEXT)
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Set 4: Controleer volledige rapporten en lastige grenzen10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Een rij in SQLite heeft email = 'nora@research.org'. Welk resultaat levert SUBSTR(email, INSTR(email, '@')) op?
  1. 'research.org'
  2. 'nora'
  3. 'nora@'
  4. '@research.org'
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

Wat geeft COALESCE(NULL, '', 'backup') terug in SQLite?
  1. ''
  2. 'backup'
  3. NULL
  4. 'NULL'
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

Een tabel in PostgreSQL heeft alleen het gehele getal qty, NUMERIC price en het gehele getal discount_pct. Een ontbrekende korting betekent dat er geen korting is. Een rapport moet afgeronde nettototalen boven 75 behouden en van hoog naar laag sorteren. Welke volledige query past?
  1. SELECT ROUND(qty * price * (1 - COALESCE(discount_pct, 0) / 100.0), 2) AS net FROM lines WHERE net > 75 ORDER BY net DESC;
  2. SELECT ROUND(qty * price * (1 - COALESCE(discount_pct, 0) / 100.0), 2) AS net FROM lines WHERE ROUND(qty * price * (1 - COALESCE(discount_pct, 0) / 100.0), 2) > 75 ORDER BY net DESC;
  3. SELECT ROUND(qty * price * (1 - COALESCE(discount_pct, 0) / 100), 2) AS net FROM lines WHERE ROUND(qty * price * (1 - COALESCE(discount_pct, 0) / 100), 2) > 75 ORDER BY net DESC;
  4. SELECT ROUND(qty * price * (1 - COALESCE(discount_pct, 0) / 100.0), 2) AS net FROM lines WHERE ROUND(qty * price * (1 - COALESCE(discount_pct, 0) / 100.0), 2) > 75 ORDER BY net ASC;
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

Een kolom reading in PostgreSQL is DOUBLE PRECISION. Hoe kan een rapport die op twee decimalen afronden zonder een fout in de functiesignatuur?
  1. ROUND(reading, 2)
  2. CAST(ROUND(reading) AS NUMERIC)
  3. ROUND(CAST(reading AS NUMERIC), 2)
  4. ROUND(CAST(reading AS INTEGER), 2)
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

Vergelijk voor '2027-01-31' de expressies date(d, '+1 month') in SQLite 3.46+, date(d, '+1 month', 'floor') in SQLite en DATE '2027-01-31' + INTERVAL '1 month' in PostgreSQL. Welke kalenderdatums zijn in die volgorde het resultaat?
  1. 28 februari; 28 februari; 28 februari
  2. 3 maart; 3 maart; 28 februari
  3. 3 maart; 28 februari; 28 februari
  4. 28 februari; 3 maart; 3 maart
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Een INTEGER stock in PostgreSQL kan NULL zijn. Vereiste numerieke indicator: NULL voor onbekende voorraad, 1 voor voorraad onder 5 en anders 0. Welke expressie past?
  1. CASE WHEN stock < 5 THEN 1 ELSE 0 END
  2. CASE WHEN stock IS NULL THEN NULL WHEN stock < 5 THEN 1 ELSE 0 END
  3. CASE WHEN stock IS NULL THEN NULL WHEN stock <= 5 THEN 1 ELSE 0 END
  4. CASE stock WHEN NULL THEN NULL WHEN 5 THEN 0 ELSE 1 END
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

SQLite 3.38+ registreert een sessie van '2027-05-08 10:15:00' tot '2027-05-08 13:45:00'. Wat geeft (unixepoch(end_time) - unixepoch(start_time)) / 3600.0 terug?
  1. 3.0
  2. 210.0
  3. 12600.0
  4. 3.5
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

Een order in SQLite heeft het gehele getal qty = 6, price = 8.0, discount_pct = 25, besteld op '2027-07-10' en verzonden op '2027-07-12'. Het nettobedrag gebruikt ROUND(qty * price * (1 - COALESCE(discount_pct, 0) / 100.0), 2). Een CASE geeft NULL-verzending het label 'open', verstreken dagen <= 2 het label 'fast' en anders 'standard'. Welk nettobedrag en label zijn het resultaat?
  1. 36.0; 'fast'
  2. 48.0; 'fast'
  3. 36.0; 'standard'
  4. 12.0; 'fast'
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Een rapport in SQLite heeft kwartaalnummers 1 tot en met 4 nodig voor elke geldige datum d. Hoe kan het voor elke maand het kwartaal berekenen?
  1. CAST(strftime('%m', d) AS INTEGER) / 3 + 1
  2. (CAST(strftime('%m', d) AS INTEGER) + 1) / 3
  3. ROUND(CAST(strftime('%m', d) AS INTEGER) / 3.0)
  4. (CAST(strftime('%m', d) AS INTEGER) + 2) / 3
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

Een tabel in SQLite heeft rijen A (qty 3, price 22.0, discount_pct NULL), B (qty 4, price 20.0, discount_pct 25) en C (qty 2, price 40.0, discount_pct 10). Een ontbrekende korting betekent dat er geen korting is. De tabel berekent ROUND(qty * price * (1 - COALESCE(discount_pct, 0) / 100.0), 2) AS net, behoudt net > 60 met de volledige expressie in WHERE en sorteert op net DESC. Wat is de rijvolgorde?
  1. B, C, A
  2. C, A
  3. C, A, B
  4. A, C
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Kom je niet uit je eigen opgave? Huiswerkhulp

Kernbegrippen

61 Kernbegrippen, elk met een definitie

A

Aangepast sorteervolgnummer
Een aangepast sorteervolgnummer kent numerieke posities toe aan waarden zodat ORDER BY een bedoelde volgorde volgt in plaats van alfabetische volgorde.
Een CASE voor prioriteit koppelt high aan 1, medium aan 2 en low aan 3 en sorteert het resultaat vervolgens oplopend.

B

Berekende kolom
Een berekende kolom in een query is een uitvoerkolom waarvan de waarde voor elke rij wordt berekend, zonder de opgeslagen gegevens te wijzigen.
Het resultaat kan quantity * unit_price AS line_total tonen, ook als de tabel geen kolom line_total heeft.

C

CASE-expressie met voorwaarden
Een CASE-expressie met voorwaarden test voorwaarden in de geschreven volgorde en geeft het resultaat van de eerste TRUE-voorwaarde voor de huidige rij terug.
CASE WHEN total < 50 THEN 'small' ELSE 'large' END kiest een label op basis van het bedrag in de rij.
CEIL
CEIL is een numerieke functie die het kleinste gehele getal teruggeeft dat groter dan of gelijk aan de invoer is; CEILING is een andere naam.
De berekening CEIL(4.1) geeft 5 omdat vier onder de invoer ligt en vijf het volgende gehele getal is.
COALESCE
COALESCE is een standaard-SQL-functie die het eerste argument teruggeeft dat niet NULL is, of NULL als alle argumenten NULL zijn.
COALESCE(mobile_phone, home_phone, 'no phone') gebruikt het huistelefoonnummer als het mobiele nummer ontbreekt.
Concatenatie
Concatenatie voegt tekstdelen achter elkaar samen, behoudt hun tekens en vereist dat je een gewenst scheidingsteken zelf toevoegt.
first_name || ' ' || last_name voegt een spatie in tussen de twee geregistreerde naamdelen.

D

DATE
DATE is een gegevenstype voor een kalenderdag in PostgreSQL en standaard-SQL; het heeft geen tijdstipcomponent.
DATE '2026-03-14' markeert 14 maart 2026 expliciet als een datumwaarde in PostgreSQL.
Deeltekenreeks
Een deeltekenreeks is een aaneengesloten deel van een tekenreeks, opgehaald met een startpositie en, indien nodig, een aantal tekens.
SUBSTR('Boston', 1, 3) geeft 'Bos' terug en neemt drie tekens vanaf de eerste positie.
Driewaardige logica
Driewaardige logica combineert TRUE, FALSE en UNKNOWN in SQL-voorwaarden, zodat ontkenning niet altijd een bekend resultaat oplevert.
FALSE AND UNKNOWN is FALSE, maar TRUE AND UNKNOWN blijft UNKNOWN omdat de tweede eis onbeslist is.
Drijvendekommagetal
Een drijvendekommagetal is een benaderde numerieke weergave die bij het opslaan van decimale breuken kleine fouten kan veroorzaken.
In SQLite kan 0.1 + 0.2 = 0.3 onwaar zijn omdat de opgeslagen benaderingen niet tot dezelfde waarde optellen.

E

Eenvoudige CASE-expressie
Een eenvoudige CASE-expressie vergelijkt één expressie met een reeks waarden op gelijkheid en geeft het resultaat voor de eerste overeenkomende waarde terug.
CASE status WHEN 'S' THEN 'Shipped' ELSE 'Other' END zet een opgeslagen statuscode om.
ELSE-vervangingswaarde
Een ELSE-vervangingswaarde is het CASE-resultaat dat wordt gebruikt als geen WHEN-voorwaarde TRUE is, ook als voorwaarden UNKNOWN zijn.
Een totaal dat NULL is kan bij ELSE 'large' terechtkomen, tenzij een eerdere tak expliciet total IS NULL test.
Expliciete typeconversie
Een expliciete typeconversie is een typewijziging die door de query wordt gevraagd, meestal met CAST, zodat de bedoelde bewerking duidelijk is.
De expressie CAST(quantity AS REAL) / 4 verandert de operand in SQLite voordat de deling een deel achter de komma kan verliezen.
Expressie
Een expressie combineert waarden, kolomnamen, operatoren of functieaanroepen om een waarde te produceren die SQL kan gebruiken.
In een orderquery is quantity * unit_price een expressie die voor elke rij het regelbedrag oplevert.
EXTRACT
EXTRACT is een standaard-SQL-functie die een benoemd onderdeel, zoals jaar of maand, als getal uit een datum- of tijdwaarde haalt.
EXTRACT(MONTH FROM DATE '2026-03-14') in PostgreSQL geeft de numerieke maandwaarde 3 terug.

F

FLOOR
FLOOR is een numerieke functie die het grootste gehele getal teruggeeft dat kleiner dan of gelijk aan de invoer is en dus naar kleinere waarden gaat.
Voor een negatieve invoer is FLOOR(-4.1) gelijk aan -5, dus het verschilt van alleen het deel achter de komma afkappen.
Functienesting
Functienesting plaatst een functieaanroep binnen een andere, zodat het binnenste resultaat een argument van de omringende aanroep wordt.
In ROUND(COALESCE(amount, 0), 2) wordt de vervangingswaarde bepaald voordat de afrondingsfunctie haar invoer ontvangt.

G

Gegevenstype
Een gegevenstype beschrijft het soort waarde en helpt bepalen welke bewerkingen, conversies, vergelijkingen en sorteerregels gelden.
De tekstliteral '42' en het gehele getal 42 kunnen er in een overzicht hetzelfde uitzien, maar zich in SQL anders gedragen.
Gehele deling
Gehele deling deelt gehele operanden en kapt in SQLite en PostgreSQL het deel achter de komma af in de richting van nul.
Een query met 7 / 2 levert 3 op; als je van de tweede operand 2.0 maakt, blijft het deel achter de komma behouden en ontstaat 3,5.
Getal als tekst
Een getal als tekst is een tekenreeks met getaltekens; de tekstvorm beïnvloedt de sortering totdat de waarde voor numeriek gebruik wordt geconverteerd.
De tekenreeksen '10', '100' en '9' verschijnen in die oplopende tekstvolgorde, die verschilt van de numerieke volgorde.
Grenswaarde
Een grenswaarde ligt op de grens tussen categorieën, zodat de keuze voor < of <= bepaalt in welke categorie de waarde valt.
Op de grens 50 is total < 50 onwaar; als je de test verandert in total <= 50, wordt deze waar.

H

Halfopen bereik
Een halfopen bereik sluit de begingrens in en de eindgrens uit, zodat opeenvolgende perioden met tijdstempels op elkaar aansluiten.
ordered_at >= '2026-03-01' AND ordered_at < '2026-04-01' omvat alle tijdstempels van maart.

I

Impliciete typeconversie
Een impliciete typeconversie is een typewijziging die de database automatisch uitvoert bij het verwerken van een bewerking of expressie.
SQLite en PostgreSQL zetten 42 om naar tekst in 'Order #' || 42, wat het label 'Order #42' oplevert.
INSTR
INSTR is een SQLite-functie die de eerste positie van een zoektekenreeks binnen tekst teruggeeft, of nul als er geen overeenkomst is.
INSTR('ana@example.com', '@') geeft 4, terwijl een tekenreeks zonder @ nul oplevert.
IS NULL
IS NULL is een test op ontbrekende waarden die TRUE teruggeeft als de operand NULL is en FALSE als een waarde aanwezig is.
WHERE phone IS NULL haalt klanten zonder geregistreerd telefoonnummer op zonder een waarde met gelijkheid met NULL te vergelijken.
ISO-datumnotatie
De ISO-datumnotatie YYYY-MM-DD plaatst jaar, maand en dag met vaste breedte in aflopende volgorde van grootte en voorkomt dubbelzinnigheid door lokale notaties.
De tekst '2026-03-14' heeft voorloopnullen en wordt in datumvolgorde vóór '2026-11-02' gesorteerd.

J

Jaar-maandaanduiding
Een jaar-maandaanduiding is een tekstweergave van een jaar en maand die één rapportageperiode aanduidt zonder jaren samen te voegen.
Het label '2026-03' houdt maart 2026 in een rapportweergave gescheiden van maart 2025.
Juliaans dagnummer
Een Juliaans dagnummer geeft een datum en tijd weer als een numeriek aantal dagen; twee waarden aftrekken meet verstreken dagen.
SQLite gebruikt julianday(end_date) - julianday(start_date) in plaats van ISO-datumtekenreeksen rechtstreeks af te trekken.

K

Kolomalias
Een kolomalias is een naam die aan een uitvoerkolom van een query wordt toegekend, vaak met AS, zodat het resultaat een duidelijke kolomkop heeft.
De query geeft het berekende bedrag een naam met AS line_total en kan erop sorteren met ORDER BY line_total.

L

Leeftijd in voltooide jaren
Een leeftijd in voltooide jaren telt verjaardagen die op een referentiedatum zijn bereikt, zodat van een verschil tussen jaartallen mogelijk één jaar moet worden afgetrokken.
Iemand die op 2 november 1990 is geboren, is op 21 oktober 2026 nog 35, vóór de verjaardag van dat jaar.
LENGTH
LENGTH telt in SQLite en PostgreSQL tekens in tekst, inclusief spaties; lege tekst heeft lengte nul en NULL geeft NULL terug.
LENGTH(' Bo ') geeft 4 omdat beide spaties aan de randen meetellen, evenals de twee letters.
Literal
Een literal is een waarde die rechtstreeks in SQL wordt geschreven, zoals een getal of tekst tussen aanhalingstekens, in plaats van uit een kolom te worden gelezen.
De spatie in first_name || ' ' || last_name is een tekstliteral die door de query wordt geleverd.
Logische verwerkingsvolgorde
De logische verwerkingsvolgorde beschrijft hoe clausules een resultaat opbouwen: FROM kiest rijen, WHERE filtert, SELECT berekent en ORDER BY sorteert.
Een uitvoeralias is beschikbaar voor ORDER BY, maar een WHERE-voorwaarde die ook elders werkt, herhaalt de berekende expressie achter die alias.

M

Modulo
Modulo geeft de rest van een deling terug en wordt in SQLite en PostgreSQL met % geschreven of in verschillende dialecten met MOD.
Bij 135 minuten geeft 135 % 60 de 15 minuten die na twee volledige uren overblijven.

N

NULL
NULL is een markering voor een ontbrekende of onbekende waarde, die verschilt van nul en, in SQLite en PostgreSQL, van een lege tekenreeks.
Een ontbrekende bonus maakt salary + bonus onbekend, ook al is het salaris van de werknemer geregistreerd.
NULL-veilige vergelijking
Een NULL-veilige vergelijking geeft ook bij ontbrekende invoer een definitief vergelijkingsresultaat en kan twee NULL-waarden als gelijk behandelen.
NULL IS NOT DISTINCT FROM NULL is TRUE in PostgreSQL en in SQLite vanaf versie 3.39.
NULLIF
NULLIF is een standaard-SQL-functie die NULL teruggeeft als de twee argumenten gelijk zijn en anders het eerste argument teruggeeft.
NULLIF(visits, 0) behoudt positieve bezoekersaantallen maar zet nul om in een ontbrekende deler voor een percentage.
Numerieke indicator
Een numerieke indicator is een uitvoerwaarde zoals 1 of 0 die vastlegt of een bepaalde voorwaarde voor een rij waar was.
CASE WHEN discount_pct > 0 THEN 1 ELSE 0 END kent nul toe aan zowel ontbrekende als niet-positieve kortingen.

O

Omzetting naar hoofdletters of kleine letters
Omzetting naar hoofdletters of kleine letters verandert letters met functies zoals UPPER en LOWER, volgens de tekenregels van de database.
LOWER(TRIM(email)) maakt een opgeschoond ASCII-e-mailadres consistent voor een vergelijking zonder verschil in hoofdletters.
Operatorprioriteit
Operatorprioriteit is de rangorde die bepaalt welke bewerkingen eerst gebeuren als een expressie geen haakjes bevat die de volgorde veranderen.
SQL vermenigvuldigt vóór het optelt in 10 + 3 * 2, dus het resultaat is 16 in plaats van 26.
Opmaakpatroon
Een opmaakpatroon bepaalt welke datum- en tijdonderdelen worden weergegeven en hoe ze worden gerangschikt, met symbolen die de database definieert.
SQLite gebruikt '%m/%d/%Y' voor een Amerikaans datumlabel; TO_CHAR in PostgreSQL gebruikt 'MM/DD/YYYY'.
Opvullen
Opvullen voegt opvultekens toe om een gekozen tekenreeksbreedte te bereiken; een opvulbewerking met vaste breedte kan ook een te lange waarde afkappen.
LPAD('42', 5, '0') in PostgreSQL geeft '00042' terug en maakt een korte code vijf tekens lang.

P

Plaatsaanduiding
Een plaatsaanduiding is een geregistreerde waarde die ontbrekende informatie vertegenwoordigt, zoals lege tekst, en mogelijk naar NULL moet worden geconverteerd.
NULLIF(phone, '') zet een lege telefoontekenreeks om in NULL voordat een weergavelabel wordt gegeven.

R

Rapportagequery
Een rapportagequery selecteert en presenteert gegevens voor een doel en combineert vaak berekende bedragen, opgeschoonde labels, datums en indelingen.
Een orderrapport kan een nettototaal naast een ordermaand en een CASE-label voor verzendsnelheid tonen.
REPLACE
REPLACE is een tekenreeksfunctie die elke exacte verschijning van een tekstfragment in de teruggegeven waarde door een ander fragment vervangt.
REPLACE('555-0100', '-', '') verwijdert het koppelteken en toont '5550100' zonder de tabel te wijzigen.
ROUND
ROUND is een numerieke functie die de dichtstbijzijnde waarde bij een gevraagde decimale precisie kiest, met typeafhankelijke regels voor waarden halverwege twee uitkomsten.
Het rapport gebruikt ROUND((price - cost) / price * 100, 1) om een marge op één decimaal weer te geven.

S

Scalaire functie
Een scalaire functie geeft één waarde terug voor elke invoerrij en groepeert geen rijen.
Als je UPPER(city) in SELECT gebruikt, verandert de weergegeven stadstekst voor elke klant die de query teruggeeft.
Sorteerregels (collation)
Sorteerregels bepalen hoe tekst wordt vergeleken en geordend, waaronder of letters met verschillende hoofdletters als gelijk worden beschouwd.
De standaard hoofdletterongevoelige sorteerregels van MySQL kunnen 'Boston' = 'boston' waar maken, terwijl dit standaard in SQLite niet zo is.
Steekproefcontrole
Een steekproefcontrole vergelijkt berekende uitvoerwaarden met handmatig uitgewerkte resultaten voor enkele bekende rijen voordat je het volledige rapport vertrouwt.
Als je LIMIT 5 toevoegt tijdens het bouwen van het rapport, kun je een ontbrekende spatie of een fout door gehele deling gemakkelijker vinden.
strftime
strftime is een datum- en tijdfunctie in SQLite die tekst teruggeeft op basis van een opmaakpatroon, waaronder datumonderdelen met voorloopnullen.
strftime('%m', '2026-03-14') geeft '03' terug; vergelijk dit met tekst of converteer het vóór numeriek gebruik.

T

Tekenpositie
Een tekenpositie geeft aan waar een teken in een tekenreeks voorkomt; SQL-tekstposities beginnen bij 1 en tellen spaties mee.
De @ in 'ana@example.com' staat op positie 4, dus het domein begint op positie 5.
Tekenreeks
Een tekenreeks is een tekstwaarde die bestaat uit tekens, waaronder letters, cijfers, leestekens en spaties, en die in SQL als literal tussen enkele aanhalingstekens wordt geschreven.
De tekenreeks ' New York ' bevat spaties aan de randen en twee spaties binnenin die de lengte beïnvloeden.
Tijdsinterval
Een tijdsinterval is een waarde in PostgreSQL die een tijdspanne voorstelt, zoals één kalendermaand of het verschil tussen tijdstempels.
Als je INTERVAL '1 month' bij een DATE in PostgreSQL optelt, krijg je een tijdstempel volgens de regel voor het einde van de maand.
TIMESTAMP
Een TIMESTAMP bevat een datum en een tijdstip, zodat een query momenten binnen dezelfde kalenderdag kan onderscheiden.
Een record op '2026-03-31 14:05:00' is later dan middernacht aan het begin van 31 maart.
TRIM
TRIM is een tekenreeksfunctie die standaard spaties aan beide uiteinden verwijdert en spaties binnen de tekst ongewijzigd laat.
Na TRIM(' New York ') blijven de twee spaties tussen de woorden in de teruggegeven tekst staan.
Typeaffiniteit
Typeaffiniteit is de voorkeur van SQLite voor de manier waarop een kolom waarden opslaat; een gewone kolom kan nog steeds waarden van verschillende typen bevatten.
Een NUMERIC-declaratie in SQLite kan 7 als geheel getal bewaren en garandeert dus geen decimale deling.

U

Unixtijd
Unixtijd meet tijd in seconden vanaf een vast UTC-beginpunt; verschillen tussen Unixtijden kunnen worden omgerekend naar verstreken uren.
SQLite trekt twee unixepoch-resultaten van elkaar af en deelt door 3600.0 om uren met een deel achter de komma in een tijdsduur te behouden.
UNKNOWN
UNKNOWN is de derde mogelijke uitkomst van een SQL-voorwaarde, die ontstaat wanneer ontbrekende informatie een definitief ware of onware vergelijking verhindert.
De voorwaarde bonus = NULL is UNKNOWN en kan dus geen ontbrekende bonus in een WHERE-filter vinden.
UTC
UTC is de gemeenschappelijke tijdreferentie die SQLite voor CURRENT_DATE en CURRENT_TIMESTAMP gebruikt; de datum kan verschillen van een lokale kalenderdatum.
Een rapport rond lokale middernacht kan een andere dag tonen als het SQLite CURRENT_DATE gebruikt in plaats van localtime.

V

Vervangingswaarde
Een vervangingswaarde is de vervanging die wordt gekozen als de voorkeursgegevens ontbreken; ze moet passen bij zowel de betekenis als het type van de uitvoer.
Een rapport kan nul gebruiken voor een niet-betaalde bonus en een niet-geregistreerde beoordeling laten ontbreken in plaats van een score te verzinnen.

W

WHEN-tak
Een WHEN-tak is één keuze met een voorwaarde en resultaat in CASE, waarbij THEN de waarde levert als die voorwaarde als eerste waar is.
Als je een brede tak < 200 eerst zet, kan een latere tak < 50 mogelijk nooit worden gekozen.

Over deze les

Door StudeliFout melden

Maak je eigen Studiemateriaal

Maak van je aantekeningen, slides en documenten Leermodules, Oefenvragen, Flashcards en 6 andere tools.

Aan de slag