# SQL-Befehle

Aus Sicherheits- und Stabilitätsgründen erlauben wir nur eine sorgfältig ausgewählte Sammlung von SQL-Funktionen. Dies stellt sicher, dass Abfragen keine Daten ändern, auf Systemressourcen zugreifen oder die Daten anderer Benutzer beeinträchtigen können. Die unten aufgeführten Funktionen wurden getestet und für die Verwendung in der Polyteia-Plattform freigegeben.

Falls Sie zusätzliche SQL-Funktionen für Ihren Anwendungsfall benötigen, wenden Sie sich gerne über unsere [Hilfe- und Support-Seite](https://github.com/polyteia-de/docs/blob/main/help-center/hilfe-und-support.md) an uns und wir prüfen Ihre Anfrage gerne.

## Mathematische Funktionen

<details>

<summary>ABS - Absoluter Wert</summary>

Gibt den absoluten (positiven) Wert einer Zahl zurück.

**Syntax:** `ABS(zahl)`

**Beispiel:**

```sql
SELECT ABS(-25) AS ergebnis
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt zurück: 25
```

</details>

<details>

<summary>CEIL - Auf nächste ganze Zahl aufrunden</summary>

Rundet eine Zahl auf die nächste ganze Zahl auf.

**Syntax:** `CEIL(zahl)`

**Beispiel:**

```sql
SELECT CEIL(4.3) AS ergebnis
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt zurück: 5
```

</details>

<details>

<summary>FLOOR - Auf nächste ganze Zahl abrunden</summary>

Rundet eine Zahl auf die nächste ganze Zahl ab.

**Syntax:** `FLOOR(zahl)`

**Beispiel:**

```sql
SELECT FLOOR(4.8) AS ergebnis
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt zurück: 4
```

</details>

<details>

<summary>ROUND - Auf ganze Zahl oder Dezimalstellen runden</summary>

Rundet eine Zahl auf die nächste ganze Zahl oder bestimmte Dezimalstellen.

**Syntax:** `ROUND(zahl, [dezimalstellen])`

**Beispiel:**

```sql
SELECT ROUND(4.567, 2) AS ergebnis
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt zurück: 4.57
```

</details>

<details>

<summary>SQRT - Quadratwurzel</summary>

Gibt die Quadratwurzel einer Zahl zurück.

**Syntax:** `SQRT(zahl)`

**Beispiel:**

```sql
SELECT SQRT(16) AS ergebnis
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt zurück: 4
```

</details>

<details>

<summary>EXP - Exponentialfunktion</summary>

Gibt e hoch der angegebenen Zahl zurück.

**Syntax:** `EXP(zahl)`

**Beispiel:**

```sql
SELECT EXP(1) AS ergebnis
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt zurück: 2.718281828459045
```

</details>

<details>

<summary>LN - Natürlicher Logarithmus</summary>

Gibt den natürlichen Logarithmus einer Zahl zurück.

**Syntax:** `LN(zahl)`

**Beispiel:**

```sql
SELECT LN(2.718281828459045) AS ergebnis
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt zurück: 1
```

</details>

<details>

<summary>LOG - Logarithmus</summary>

Gibt den Logarithmus einer Zahl zu einer bestimmten Basis zurück.

**Syntax:** `LOG(basis, zahl)`

**Beispiel:**

```sql
SELECT LOG(10, 100) AS ergebnis
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt zurück: 2
```

</details>

<details>

<summary>POWER - Potenzieren</summary>

Gibt eine Zahl hoch einer anderen Zahl zurück.

**Syntax:** `POWER(basis, exponent)`

**Beispiel:**

```sql
SELECT POWER(2, 3) AS ergebnis
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt zurück: 8
```

</details>

<details>

<summary>MOD - Modulo-Operation</summary>

Gibt den Rest einer Division zurück.

**Syntax:** `MOD(dividend, divisor)`

**Beispiel:**

```sql
SELECT MOD(10, 3) AS ergebnis
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt zurück: 1
```

</details>

## Aggregatfunktionen

<details>

<summary>COUNT - Zeilen zählen</summary>

Zählt die Anzahl der Zeilen oder Nicht-NULL-Werte.

**Syntax:** `COUNT(*)` oder `COUNT(spalte)`

**Beispiel:**

```sql
SELECT COUNT(*) AS gesamtzeilen
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
```

</details>

<details>

<summary>COUNT_DISTINCT - Eindeutige Werte zählen</summary>

Zählt die Anzahl der eindeutigen (verschiedenen) Werte in einer Spalte.

**Syntax:** `COUNT_DISTINCT(spalte)`

**Beispiel:**

```sql
SELECT COUNT_DISTINCT(abteilung) AS eindeutige_abteilungen
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
```

</details>

<details>

<summary>COUNT_IF - Bedingte Anzahl</summary>

Zählt Zeilen, die eine bestimmte Bedingung erfüllen.

**Syntax:** `COUNT_IF(bedingung)`

**Beispiel:**

```sql
SELECT COUNT_IF(alter > 30) AS erwachsene_ueber_30
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
```

</details>

<details>

<summary>SUM - Werte summieren</summary>

Berechnet die Summe numerischer Werte.

**Syntax:** `SUM(spalte)`

**Beispiel:**

```sql
SELECT SUM(gehalt) AS gesamtgehalt
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
```

</details>

<details>

<summary>AVG - Durchschnittswert</summary>

Berechnet den Durchschnitt numerischer Werte.

**Syntax:** `AVG(spalte)`

**Beispiel:**

```sql
SELECT AVG(alter) AS durchschnittsalter
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
```

</details>

<details>

<summary>MIN - Minimalwert</summary>

Gibt den kleinsten Wert in einer Spalte zurück.

**Syntax:** `MIN(spalte)`

**Beispiel:**

```sql
SELECT MIN(gehalt) AS niedrigstes_gehalt
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
```

</details>

<details>

<summary>MAX - Maximalwert</summary>

Gibt den größten Wert in einer Spalte zurück.

**Syntax:** `MAX(spalte)`

**Beispiel:**

```sql
SELECT MAX(gehalt) AS hoechstes_gehalt
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
```

</details>

<details>

<summary>STRING_AGG - Strings verketten</summary>

Verkettet String-Werte mit einem bestimmten Trennzeichen.

**Syntax:** `STRING_AGG(spalte, trennzeichen)`

**Beispiel:**

```sql
SELECT STRING_AGG(name, ', ') AS alle_namen
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt zurück: "Hans, Maria, Peter"
```

</details>

<details>

<summary>ANY_VALUE - Beliebigen Wert erhalten</summary>

Gibt einen beliebigen Wert aus einer Gruppe zurück (nützlich mit GROUP BY).

**Syntax:** `ANY_VALUE(spalte)`

**Beispiel:**

```sql
SELECT abteilung, ANY_VALUE(leiter) AS beispiel_leiter
FROM '{{ds_ihr_datensatz}}' 
GROUP BY abteilung
LIMIT 10
```

</details>

## Typkonvertierungsfunktionen

<details>

<summary>CAST - Datentypen konvertieren</summary>

Konvertiert einen Wert von einem Datentyp zu einem anderen.

**Syntax:** `CAST(wert AS datentyp)`

**Beispiel:**

```sql
SELECT CAST('123' AS INTEGER) AS zahl
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt zurück: 123
```

</details>

## String-Funktionen

<details>

<summary>SUBSTR - Teiltext aus String extrahieren</summary>

Extrahiert einen Teil eines Strings ab einer bestimmten Position.

**Syntax:** `SUBSTR(string, start, länge)`

**Beispiel:**

```sql
SELECT SUBSTR("Hallo Welt", 1, 5) AS ergebnis
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt zurück: "Hallo"
```

</details>

<details>

<summary>LEFT - Zeichen von links erhalten</summary>

Gibt die linkesten Zeichen eines Strings zurück.

**Syntax:** `LEFT(string, länge)`

**Beispiel:**

```sql
SELECT LEFT("Hallo Welt", 5) AS ergebnis
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt zurück: "Hallo"
```

</details>

<details>

<summary>RIGHT - Zeichen von rechts erhalten</summary>

Gibt die rechtesten Zeichen eines Strings zurück.

**Syntax:** `RIGHT(string, länge)`

**Beispiel:**

```sql
SELECT RIGHT("Hallo Welt", 4) AS ergebnis
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt zurück: "Welt"
```

</details>

<details>

<summary>REPLACE - Text in String ersetzen</summary>

Ersetzt alle Vorkommen eines Teilstrings durch einen anderen Teilstring.

**Syntax:** `REPLACE(string, alter_text, neuer_text)`

**Beispiel:**

```sql
SELECT REPLACE("Hallo Welt", "Welt", "DuckDB") AS ergebnis
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt zurück: "Hallo DuckDB"
```

</details>

<details>

<summary>REGEXP_REPLACE - Ersetzen mit regulären Ausdrücken</summary>

Ersetzt Text mithilfe von regulären Ausdrücken für erweiterte Textmanipulation.

**Syntax:** `REGEXP_REPLACE(string, muster, ersetzung)`

**Beispiel:**

```sql
-- Konvertiere TT.MM.JJJJ zu JJJJ-MM-TT Format
SELECT REGEXP_REPLACE("19.02.2025", '(\d{2})\.(\d{2})\.(\d{4})', '\3-\2-\1') AS ergebnis
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt zurück: "2025-02-19"
```

</details>

<details>

<summary>SUBSTRING - Alternative zu SUBSTR</summary>

Extrahiert einen Teil eines Strings ab einer bestimmten Position (identisch mit SUBSTR).

**Syntax:** `SUBSTRING(string, start, länge)`

**Beispiel:**

```sql
SELECT SUBSTRING("Hallo Welt", 1, 5) AS ergebnis
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt zurück: "Hallo"
```

</details>

<details>

<summary>TRIM - Leerzeichen entfernen</summary>

Entfernt Leerzeichen am Anfang und Ende eines Strings.

**Syntax:** `TRIM(string)` oder `TRIM(zeichen FROM string)`

**Beispiel:**

```sql
SELECT TRIM("  Hallo Welt  ") AS ergebnis
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt zurück: "Hallo Welt"
```

</details>

<details>

<summary>RTRIM - Leerzeichen rechts entfernen</summary>

Entfernt Leerzeichen am Ende (rechts) eines Strings.

**Syntax:** `RTRIM(string)`

**Beispiel:**

```sql
SELECT RTRIM("Hallo Welt   ") AS ergebnis
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt zurück: "Hallo Welt"
```

</details>

<details>

<summary>LTRIM - Leerzeichen links entfernen</summary>

Entfernt Leerzeichen am Anfang (links) eines Strings.

**Syntax:** `LTRIM(string)`

**Beispiel:**

```sql
SELECT LTRIM("   Hallo Welt") AS ergebnis
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt zurück: "Hallo Welt"
```

</details>

<details>

<summary>UPPER - In Großbuchstaben konvertieren</summary>

Konvertiert alle Buchstaben eines Strings in Großbuchstaben.

**Syntax:** `UPPER(string)`

**Beispiel:**

```sql
SELECT UPPER("Hallo Welt") AS ergebnis
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt zurück: "HALLO WELT"
```

</details>

<details>

<summary>LOWER - In Kleinbuchstaben konvertieren</summary>

Konvertiert alle Buchstaben eines Strings in Kleinbuchstaben.

**Syntax:** `LOWER(string)`

**Beispiel:**

```sql
SELECT LOWER("HALLO WELT") AS ergebnis
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt zurück: "hallo welt"
```

</details>

<details>

<summary>CHAR_LENGTH - Anzahl Zeichen ermitteln</summary>

Gibt die Anzahl der Zeichen in einem String zurück.

**Syntax:** `CHAR_LENGTH(string)`

**Beispiel:**

```sql
SELECT CHAR_LENGTH("Hallo") AS ergebnis
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt zurück: 5
```

</details>

<details>

<summary>LENGTH - Länge des Strings ermitteln</summary>

Gibt die Länge eines Strings zurück (identisch mit CHAR\_LENGTH).

**Syntax:** `LENGTH(string)`

**Beispiel:**

```sql
SELECT LENGTH("Hallo Welt") AS ergebnis
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt zurück: 10
```

</details>

<details>

<summary>CONCAT - Strings verketten</summary>

Verkettet mehrere Strings zu einem String.

**Syntax:** `CONCAT(string1, string2, ...)`

**Beispiel:**

```sql
SELECT CONCAT("Hallo", " ", "Welt") AS ergebnis
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt zurück: "Hallo Welt"
```

</details>

<details>

<summary>REVERSE - String umkehren</summary>

Kehrt die Reihenfolge der Zeichen in einem String um.

**Syntax:** `REVERSE(string)`

**Beispiel:**

```sql
SELECT REVERSE("Hallo") AS ergebnis
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt zurück: "ollaH"
```

</details>

<details>

<summary>REPEAT - String wiederholen</summary>

Wiederholt einen String eine bestimmte Anzahl von Malen.

**Syntax:** `REPEAT(string, anzahl)`

**Beispiel:**

```sql
SELECT REPEAT("Ha", 3) AS ergebnis
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt zurück: "HaHaHa"
```

</details>

<details>

<summary>LPAD - String links auffüllen</summary>

Füllt einen String links mit Zeichen auf eine bestimmte Länge auf.

**Syntax:** `LPAD(string, länge, füllzeichen)`

**Beispiel:**

```sql
SELECT LPAD("42", 5, "0") AS ergebnis
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt zurück: "00042"
```

</details>

<details>

<summary>RPAD - String rechts auffüllen</summary>

Füllt einen String rechts mit Zeichen auf eine bestimmte Länge auf.

**Syntax:** `RPAD(string, länge, füllzeichen)`

**Beispiel:**

```sql
SELECT RPAD("Test", 8, "-") AS ergebnis
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt zurück: "Test----"
```

</details>

<details>

<summary>STARTS_WITH - Prüfen ob String mit Text beginnt</summary>

Prüft, ob ein String mit einem bestimmten Text beginnt.

**Syntax:** `STARTS_WITH(string, präfix)`

**Beispiel:**

```sql
SELECT STARTS_WITH("Hallo Welt", "Hallo") AS ergebnis
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt zurück: true
```

</details>

<details>

<summary>ENDS_WITH - Prüfen ob String mit Text endet</summary>

Prüft, ob ein String mit einem bestimmten Text endet.

**Syntax:** `ENDS_WITH(string, suffix)`

**Beispiel:**

```sql
SELECT ENDS_WITH("Hallo Welt", "Welt") AS ergebnis
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt zurück: true
```

</details>

<details>

<summary>POSITION - Position eines Teilstrings finden</summary>

Gibt die Position des ersten Vorkommens eines Teilstrings zurück.

**Syntax:** `POSITION(teilstring IN string)`

**Beispiel:**

```sql
SELECT POSITION('Welt' IN 'Hallo Welt') AS ergebnis
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt zurück: 7
```

</details>

<details>

<summary>STRPOS - Alternative Position-Funktion</summary>

Gibt die Position des ersten Vorkommens eines Teilstrings zurück (alternative Syntax).

**Syntax:** `STRPOS(string, teilstring)`

**Beispiel:**

```sql
SELECT STRPOS("Hallo Welt", "Welt") AS ergebnis
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt zurück: 7
```

</details>

<details>

<summary>INSTR - Position eines Teilstrings finden</summary>

Gibt die Position des ersten Vorkommens eines Teilstrings zurück (weitere alternative Syntax).

**Syntax:** `INSTR(string, teilstring)`

**Beispiel:**

```sql
SELECT INSTR("Hallo Welt", "Welt") AS ergebnis
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt zurück: 7
```

</details>

<details>

<summary>SPLIT_PART - Teil aus aufgeteiltem String extrahieren</summary>

Teilt einen String auf und gibt das Element an der angegebenen Position zurück.

**Syntax:** `SPLIT_PART(string, trennzeichen, position)`

**Beispiel:**

```sql
SELECT SPLIT_PART("Apfel,Banane,Kirsche", ",", 2) AS ergebnis
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt zurück: "Banane"
```

</details>

## Datum- und Zeit-Funktionen

<details>

<summary>DATE_FORMAT - Datum als String formatieren</summary>

Formatiert einen Datumswert als String mit bestimmtem Format.

**Syntax:** `DATE_FORMAT(datum, format)`

**Beispiel:**

```sql
SELECT DATE_FORMAT(CURRENT_DATE, '%d/%m/%Y') AS formatiertes_datum
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
```

</details>

<details>

<summary>DATE_PART - Teil des Datums extrahieren</summary>

Extrahiert einen bestimmten Teil aus einem Datum (Jahr, Monat, Tag, etc.).

**Syntax:** `DATE_PART(teil, datum)`

**Beispiel:**

```sql
SELECT DATE_PART('year', CURRENT_DATE) AS aktuelles_jahr
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
```

</details>

<details>

<summary>DATE_TRUNC - Datum auf bestimmte Genauigkeit kürzen</summary>

Kürzt ein Datum auf eine bestimmte Genauigkeitsstufe (Jahr, Monat, Tag, Stunde, etc.).

**Syntax:** `DATE_TRUNC(genauigkeit, datum)`

**Beispiel:**

```sql
SELECT DATE_TRUNC('day', STRPTIME("2025-02-19 14:30:00", '%Y-%m-%d %H:%M:%S')) AS ergebnis
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt zurück: "2025-02-19 00:00:00"
```

</details>

<details>

<summary>STRPTIME - String zu Datum/Zeit konvertieren</summary>

Konvertiert einen String zu einem Datum/Zeit-Wert unter Verwendung eines bestimmten Formatmusters.

**Syntax:** `STRPTIME(string, format)`

**Häufige Formatcodes:**

* `%Y` - 4-stelliges Jahr
* `%m` - Monat (01-12)
* `%d` - Tag (01-31)
* `%H` - Stunde (00-23)
* `%M` - Minute (00-59)

**Beispiel:**

```sql
-- Deutsche Datumsformat parsen
SELECT STRPTIME("19.02.2025 10:44", '%d.%m.%Y %H:%M') AS ergebnis
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt zurück: 2025-02-19 10:44:00
```

</details>

<details>

<summary>STRFTIME - Datum/Zeit zu String formatieren</summary>

Konvertiert ein Datum/Zeit-Wert zu einem String unter Verwendung eines bestimmten Formatmusters.

**Syntax:** `STRFTIME(datum, format)`

**Beispiel:**

```sql
SELECT STRFTIME(CURRENT_DATE, '%d.%m.%Y') AS ergebnis
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt aktuelles Datum im TT.MM.JJJJ Format zurück
```

</details>

<details>

<summary>SPLIT - String in Array aufteilen</summary>

Teilt einen String in ein Array mit einem Trennzeichen auf.

**Syntax:** `SPLIT(string, trennzeichen)`

**Beispiel:**

```sql
SELECT SPLIT('Apfel,Banane,Kirsche', ',') AS frucht_array
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt zurück: ['Apfel', 'Banane', 'Kirsche']
```

</details>

<details>

<summary>YEAR - Jahr aus Datum extrahieren</summary>

Extrahiert das Jahr aus einem Datumswert.

**Syntax:** `YEAR(datum)`

**Beispiel:**

```sql
SELECT YEAR(CURRENT_DATE) AS aktuelles_jahr
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
```

</details>

## Array-Funktionen

<details>

<summary>UNNEST - Array in Zeilen erweitern</summary>

Konvertiert ein Array in einzelne Zeilen, mit einer Zeile pro Array-Element.

**Syntax:** `UNNEST(array)`

**Beispiel:**

```sql
SELECT UNNEST(['Apfel', 'Banane', 'Kirsche']) AS frucht
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt drei Zeilen zurück: "Apfel", "Banane", "Kirsche"
```

</details>

<details>

<summary>ARRAY_LENGTH - Array-Größe ermitteln</summary>

Gibt die Anzahl der Elemente in einem Array zurück.

**Syntax:** `ARRAY_LENGTH(array)`

**Beispiel:**

```sql
SELECT ARRAY_LENGTH(['Apfel', 'Banane', 'Kirsche']) AS array_groesse
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt zurück: 3
```

</details>

<details>

<summary>CONTAINS - Prüfen ob Array Wert enthält</summary>

Prüft, ob ein Array einen bestimmten Wert enthält.

**Syntax:** `CONTAINS(array, wert)`

**Beispiel:**

```sql
SELECT CONTAINS(['Apfel', 'Banane', 'Kirsche'], 'Banane') AS hat_banane
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt zurück: true
```

</details>

## Hilfsfunktionen

<details>

<summary>NULLIF - NULL zurückgeben wenn Werte gleich sind</summary>

Gibt NULL zurück, wenn zwei Werte gleich sind, ansonsten den ersten Wert.

**Syntax:** `NULLIF(wert1, wert2)`

**Beispiel:**

```sql
SELECT NULLIF(gehalt, 0) AS nicht_null_gehalt
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
-- Gibt NULL zurück wenn Gehalt 0 ist, ansonsten das Gehalt
```

</details>

## Operatoren

<details>

<summary>|| - String-Verkettung</summary>

Verkettet zwei oder mehr Strings miteinander.

**Syntax:** `string1 || string2`

**Beispiel:**

```sql
SELECT vorname || ' ' || nachname AS vollname
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
```

</details>

<details>

<summary>IN - Prüfen ob Wert in Liste existiert</summary>

Prüft, ob ein Wert in einer Liste von Werten existiert.

**Syntax:** `spalte IN (wert1, wert2, wert3)`

**Beispiel:**

```sql
SELECT * 
FROM '{{ds_ihr_datensatz}}' 
WHERE abteilung IN ('Vertrieb', 'Marketing', 'IT')
LIMIT 10
```

</details>

## Räumliche Funktionen (Geospatial)

*Hinweis: Diese Funktionen sind für die Arbeit mit geografischen Daten und räumlichen Operationen verfügbar.*

<details>

<summary>ST_AREA - Fläche einer Geometrie berechnen</summary>

Berechnet die Fläche eines Polygons oder einer anderen 2D-Geometrie.

**Syntax:** `ST_AREA(geometrie)`

**Beispiel:**

```sql
SELECT ST_AREA(polygon_spalte) AS flaeche_qm
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
```

</details>

<details>

<summary>ST_DISTANCE - Entfernung zwischen Geometrien berechnen</summary>

Berechnet die Entfernung zwischen zwei Geometrien.

**Syntax:** `ST_DISTANCE(geometrie1, geometrie2)`

**Beispiel:**

```sql
SELECT ST_DISTANCE(punkt1, punkt2) AS entfernung_m
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
```

</details>

<details>

<summary>ST_CONTAINS - Prüfen ob Geometrie eine andere enthält</summary>

Prüft, ob eine Geometrie eine andere Geometrie vollständig enthält.

**Syntax:** `ST_CONTAINS(geometrie1, geometrie2)`

**Beispiel:**

```sql
SELECT ST_CONTAINS(polygon, punkt) AS punkt_im_polygon
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
```

</details>

<details>

<summary>ST_INTERSECTS - Prüfen ob Geometrien sich überschneiden</summary>

Prüft, ob sich zwei Geometrien überschneiden (überlappen oder Raum teilen).

**Syntax:** `ST_INTERSECTS(geometrie1, geometrie2)`

**Beispiel:**

```sql
SELECT ST_INTERSECTS(polygon1, polygon2) AS polygone_ueberlappen
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
```

</details>

<details>

<summary>ST_POINT - Punkt-Geometrie erstellen</summary>

Erstellt eine Punkt-Geometrie aus X- und Y-Koordinaten.

**Syntax:** `ST_POINT(x, y)`

**Beispiel:**

```sql
SELECT ST_POINT(laengengrad, breitengrad) AS standort_punkt
FROM '{{ds_ihr_datensatz}}' 
LIMIT 10
```

</details>

*Für eine vollständige Liste der räumlichen Funktionen siehe die* [*DuckDB Spatial Extension Dokumentation*](https://duckdb.org/docs/stable/extensions/spatial/functions.html)*.*
