SQL Parser

Der Parser-Treiber übernimmt das SQL-Parsing und unterstützt verschiedene Operatoren und Funktionen, die auf die abgefragten Daten angewendet werden können. Dieses Kapitel beschreibt den genauen Sprachumfang sowie die angebotenen Operatoren, Funktionen und Pseudospalten im Detail.

Derzeit unterstützen die meisten Treiber nur Lesen per SQL SELECT-Statement. INSERT, UPDATE und DELETE sind schon in einigen Treibern umgesetzt.

In den folgenden Syntaxbeschreibungen stehen eckige Klammern für optionale Bestandteile. Ein senkrechter Strich trennt Alternativen: Es darf genau eine der angegebenen Varianten verwendet werden. Platzhalter in spitzen Klammern wie <expression> oder <identifier> stehen für Ausdrücke bzw. Namen, die an dieser Stelle eingesetzt werden.

SELECT

SELECT liest Daten aus der Quelle oder berechnet Ausdrücke ohne Quelle. Die FROM-Klausel hat mehrere Varianten für Dateien, Verzeichnisse und Objekte.

SELECT <expression-1> [ AS <identifier-1> ]
     , <expression-2> [ AS <identifier-2> ]
       ...
     , <expression-n> [ AS <identifier-n> ]
 [
   FROM <identifier>.FILES() | <identifier>[.<identifier>] [tableColumns] [tableOptions]
   [ WHERE <expression> ]
   [ FILTER <filter-text> [ ENDFILTER ] ]
   [ ORDERBY <orderby-text> [ ENDORDERBY ] ]
 ]

Es gibt folgende Varianten bei der Tabellenangabe:

Kein FROM-Abschnitt

Es wird keine Quelle benötigt. Die Abfrage gibt eine Zeile zurück und das Ergbnis sind die angegebenen Ausdrücke, die auf Literalen basieren.

FROM <identifier>.FILES()

  • Der angegebene Identifier zeigt auf ein Verzeichnis.
  • Pro gefundener Datei liefert das Ergebnis eine Zeile.
  • Diese Sytax wird nur bei dateibasierten JDBC-Treibern unterstützt.

Die Metadaten der Pseudospalten können dann verwendet werden.

FROM <identifier>

  • Beim Excel-Treiber ist diese Syntax nicht zulässig
  • Bei den übrigen dateibasierten Treibern zeigt der Identifier auf eine Datei
  • Beim Salesforce-Treiber zeigt der Identifier auf ein Objekt

In der Regel muss der Dateiname in doppelten Anführungsstrichen angegeben werden, da bereits das Punkt Zeichen für die Dateierweiterung nicht Teil eines nicht geschützen Identifiers ist.

FROM <identifier-1>.<identifier-2>

  • Beim Csv-Treiber wird der 1. Identifier ignoriert; der 2. Identifier ist der Dateiname
  • Bei den Json-, Xml- und Yaml-Treibern ist der 1. Identifier die Datei und der 2. Identifier der Pfad im Dokument
  • Beim Excel-Treiber gibt der 1. Identifier die Excel-Datei an und der 2. den Namen des Arbeitsblattes
  • Beim Salesforce-Treiber ist der 1. Identifier das Schema und der 2. das Objekt

In der Regel muss der Dateiname in doppelten Anführungsstrichen angegeben werden, da bereits das Punkt Zeichen für die Dateierweiterung nicht Teil eines nicht geschützen Identifiers ist.

INSERT

INSERT schreibt einen neuen Datensatz in die Quelle. Die Spaltenliste und die VALUES-Liste müssen dieselbe Anzahl von Einträgen haben. Nicht alle Treiber unterstützen INSERT.

INSERT INTO <identifier>[.<identifier>] ( <identifier-1>, ... <identifier-n> )
VALUES ( <expression-1>, ... <expression-n> )

UPDATE

UPDATE ändert vorhandene Datensätze in der Quelle. FILTER ist Pflicht, damit die Quelle die zu ändernden Datensätze identifizieren kann. Nicht alle Treiber unterstützen UPDATE.

UPDATE <identifier>[.<identifier>]
   SET <identifier-1> = <expression-1>
     [ , <identifier-2> = <expression-2> ]
       ...
 FILTER <filter-text> [ ENDFILTER ]

DELETE

DELETE entfernt Datensätze in der Quelle. FILTER ist optional: Mit FILTER werden nur die Datensätze gelöscht, die die Quelle anhand des Filtertexts identifiziert. Ohne FILTER löscht das Statement alle Datensätze der angegebenen Tabelle. Nicht alle Treiber unterstützen DELETE.

DELETE FROM <identifier>[.<identifier>]
 [ FILTER <filter-text> [ ENDFILTER ] ]

Table Columns

Mit COLUMNS wird die Spaltenliste der Quelle angegeben. Die Namen müssen zur Quelle passen; bei Csv- und Excel-Dateien können sie mit den Spaltenüberschriften abgeglichen werden.

COLUMNS ( <identifier-1>, ... <identifier-n> ) [ HEADLINE <ganze Zahl> ]

Die optionale Angabe

HEADLINE <ganze Zahl>

können nur in den csv- und excel-Treibern verwendet werden.

Table Options

SEPARATED BY, QUOTED BY und ENCODING steuern, wie eine dateibasierte Textquelle gelesen wird. Die folgenden Angaben können in beliebiger Reihenfolge stehen:

SEPARATED BY <Ein Zeichen in einfachen Anführungsstrichen>
QUOTED BY <Ein Zeichen in einfachen Anführungsstrichen>
ENCODING <Zeichenkette in einfachen Anführungsstrichen>

Wenn SEPARATED BY nicht angegeben wurde, wird ein Komma verwendet.

Wenn QUOTED BY nicht angegeben wurde, wird der doppelte Anführungsstrich verwendet.

Wenn ENCODING nicht angegeben wurde, wird UTF-8 verwendet.

FILTER und ORDERBY

FILTER und ORDERBY reichen herstellerspezifische Ausdrücke unverändert an die Quelle weiter. Nicht jeder Treiber unterstützt beide Schlüsselwörter.

Einige Treiber unterstützen das FILTER und / oder das ORDERBY Keyword. Dazu gehören:

  • SalesForce
  • Eloqua (alle APIs)
  • LDAP
  • REST

Die jeweilige Syntax die innerhalb von FILTER ... ENDFILTER (bzw. bis zum Ende) und analog ORDERBY ... ENDORDERBY (bzw. bis zum Ende) wird nicht interpretiert, sondern direkt an die Quelle weitergereicht.

Das Schlüsselwort heißt ORDERBY, nicht ORDER BY.

Nicht alle Quellen lassen Kommentare zu. Zum Auskommentieren muss der Block oberhalb von FILTER oder ORDERBY liegen, da dort der SQL-Parser die Kommentare erkennt und ausblendet.

Identifier

Identifier werden für Tabellennamen, Spaltennamen in der Quelle oder als Alias verwendet.

Identifier in doppelten Anführungsstriche werden case-sensitiv behandelt und erlauben Sonderzeichen.

Identifier ohne doppelte Anführungszeichen werden in Kleinbuchstaben gewandelt.

Beim Vergleich von Spaltennamen in csv- und excel-Dateien zu den Spaltenüberschriften wird die Groß- und Kleinschreibung ignoriert (case insensitiv).

Literale

Literale sind fest im SQL angegebene Werte. Es gibt Zahlen, Zeichenketten sowie die Schlüsselwörter NULL, TRUE und FALSE.

Zahlen

Ganzzahlige Literale sind vom Datentyp BIGINT. Sie haben einen Wertebereich von -263 bis 263-1 und werden als Ziffernfolge angegeben, z. B. 42.

Dezimalzahlen sind vom Datentyp DOUBLE. Sie enthalten einen Dezimalpunkt, z. B. 3.14, 3. oder .5.

Zeichenketten

Zeichenketten können beliebig lang sein und haben den Datentyp VARCHAR.

Zeichenkettenliterale werden von einfachen Anführungsstrichen umschlossen.

Um einen einfachen Anführungsstrich in einer Zeichenkette zu erhalten, müssen zwei Anführungsstiche angegeben werden.

Zeichenketten können auch mehrzeilig sein.

SELECT 'Karens'' Backstube', '!hallo
Du da!';

Ausgabe

 column_1 column_2
-------- --------
Karens' Backstube !hallo
Du da!

Nullwert

NULL

Der Nullwert kann als Literal über das Schlüsselwort NULL angegeben werden.

Wahr

TRUE

Der Wahrheitswert Wahr wird mit dem Schlüsselwort TRUE angegeben.

Falsch

FALSE

Der Wahrheitswert Falsch wird mit dem Schlüsselwort FALSE angegeben.

Pseudospalten

Die folgenden Pseudospalten können in Ausdrücken ohne Klammern verwendet werden:

  • ROWNUMBER — Zeilennummer in der Quelle
  • CURRENT_DATE — Tagesdatum
  • CURRENT_TIMESTAMP — aktuelles Tagesdatum mit Uhrzeit (lokal, ohne Zeitzone)
  • DIRECTORY, FILENAME, FILEDATE — Dateimetadaten (nur dateibasierte JDBC-Treiber)

Details finden sich im Abschnitt Pseudospalten.

Expressions

Expressions sind Ausdrücke, die Literale, Spaltenamen aus der Quelle, Pseudospalten, Operatoren, Fallunterscheidungen oder integrierte Funktion kombinieren können.

Statt einer Expression kann auch das Zeichen * angegeben werden. Dann ist kein Alias zulässig.

Die Prioritäten entsprechen ANSI-SQL.

Zur Veränderung der Priorität können Ausdrücke in runden Klammern gesetzt werden. Der Ausdruck innerhalb eines runde Klammernpaars wird vor den äußeren Operation berechnet.

Parameter

Ein Fragezeichen ist ein JDBC-Parameterplatzhalter. Die Werte werden später über die Setter-Methoden des JDBC-PreparedStatement in der Reihenfolge der Fragezeichen gebunden.

?