SQLScript Grundlagen

Zeichenkettenverarbeitung in SQLScript

(C) Brandeis Consulting.

Datentypen für Zeichenketten

Kleine Datentypen

  • NVARCHAR(n) – Max. 5000 Unicodezeichen
  • VARCHAR(n) – Max. 5000 ASCII Zeichen
  • ALPHANUM(n) – Max. 127 Zeichen mit Alphakonvertierung
  • SHORTTEXT – Nur in Column Tables, Max. 5000 Unicodezeichen, es wird ein Volltextindex auf der DB angelegt.

Große Datentypen

Jedes Feld kann 2 GB Daten enthalten

  • NCLOB – Wie NVARCHAR
  • CLOB – Wie VARCHAR
  • TEXT – Wie SHORTTEXT

In der SAP HANA Cloud sind nur noch NVARCHAR und NCLOB unterstützt

(C) Brandeis Consulting.

Funktionen für die Zeichenkettenverarbeitung

Wichtig: Im Gegensatz zu ABAP Textfeldern werden Zeichenketten in SQLScript nicht automatisch getrimmt. Leerzeichen können also am Ende vorkommen.

  • LENGTH(<Zeichenkette>)
  • CONCAT(<Zeichenkette1>, <Zeichenkette2>)

Die CONCAT() Funktion ist aber nicht sehr elegant, weil immer genau zwei Argumente übergeben werden müssen. Mit dem || Operator geht das wesentlich eleganter.

(C) Brandeis Consulting.

Groß- und kleinschreibung

  • LCASE(), LOWER() oder ABAP_LOWER() konvertiert in Kleinbuchstaben
  • UCASE(), UPPER() oder ABAP_UPPER() konvertiert in Großbuchstaben
  • INITCAP() Konvertiert den jeweils ersten Buchstaben jedes Wortes in Großbuchstaben, alles Andere in Kleinbuchstaben. Ab HANA 2.0 SP02

Empfehlung: Die ABAP_*-Funktionen liefern immer eine Unicode-Zeichenkette (NVARCHAR) zurück. Darum sind sie vorzuziehen.

(C) Brandeis Consulting.

Zerlegung von Zeichenketten über Länge und Position

  • LEFT(<Zeichenkette>, <Länge>),
  • RIGHT( <Zeichenkette>, <Länge>) und
  • SUBSTRING oder SUBSTR(<Zeichenkette>, <Startposition>, <Länge>)

Die Funktionen zerlegen eine Zeichenkette über die Positions- bzw. Längenangaben:

SELECT LEFT('ABCDEFGHI',3)         AS links, -->'ABC'
       SUBSTRING('ABCDEFGHI',4,3)  AS mitte, -->'DEF'
       RIGHT('ABCDEFGHI',3)        AS rechts -->'GHI'
   FROM
      DUMMY;
(C) Brandeis Consulting.

Übung

Erstelle eine Userliste aus der Tabelle USERS mit den folgeden Spalten:

  • ID
  • NAME
    • 1. Zeichen des Vornamen, in Großbuchstaben, dann
    • ein Punkt und
    • ein Leerzeichen. Und dann der
    • Nachname, wobei der erste Buchstabe groß geschrieben sein soll. Z.B.
      Beispiel: J. Brandeis
  • E-Mailadresse in Kleinbuchstaben

Beispiel:

(C) Brandeis Consulting.

Zerlegung von Zeichenketten über Suche

  • SUBSTR_BEFORE(<Zeichenkette>, <Muster>)
  • SUBSTR_AFTER(<Zeichenkette>, <Muster>)
  • SUBSTR_REGEXPR( <Muster> IN <Zeichenkette> )

Es wird in der Zeichenkette nach dem Muster gesucht…

(C) Brandeis Consulting.

Übungsaufgabe

Erstelle eine List aus den E-Mailadressen mit Namen (alles vor dem @) und Servername (alles nach dem @).

(C) Brandeis Consulting.

Reguläre Ausdrücke in SQL-Funktionen

  • LOCATE_REGEXPR()
  • OCCURRENCES_REGEXPR()
  • REPLACE_REGEXPR()
  • SUBSTR_REGEXPR()
    Alle diese Funktionen verwenden reguläre Ausdrücke. Damit kann man prima suchen, allerdings ist das sehr gewöhnungsbedürftig.
(C) Brandeis Consulting.

Reguläre Ausdrücke

„Ein regulärer Ausdruck (englisch regular expression, Abkürzung RegExp oder Regex) ist in der theoretischen Informatik eine Zeichenkette, die der Beschreibung von Mengen von Zeichenketten mit Hilfe bestimmter syntaktischer Regeln dient.“ (Wikipedia)

Am besten mit Notepad++ testen.

https://regex101.com
https://coderdojopotsdam.github.io/regex-tutorial/de/00-01.html

(C) Brandeis Consulting.

Beispiele für Ersetzung mit regulären Ausdrücken

  • \b([0-9]{1,2})\.([0-9]{1,2})\.([0-9]{4})\b findet Datumsangaben in einem Text. Dazu wird nach drei Ziffernblöcken gesucht, die mit einem Punkt getrennt sind und deren Länge 1-2, 1-2 und 4 Zeichen beträgt. Die Plausibilität des Datums wird nicht geprüft, d.h. es kann auch der 32.3.2017 gefunden werden. Eine exaktere Prüfung ist mit regulären Ausdrücken durchaus möglich, aber dazu ist ein entsprechend komplexerer Ausdruck notwendig.

Auf der nächste Folie ist ein Text zum Testen

(C) Brandeis Consulting.

Beispieltext mit Datumsangaben

Jörg:

Erzeuge mir einen Text mit vielen Datumsangaben im Format MM.DD.YYYY

ChatGPT:

Gerne, hier ist ein Beispieltext mit vielen Datumsangaben im Format MM.DD.YYYY:
Am 03.28.2023 begann ein wichtiger internationaler Gipfel, der bis zum 04.02.2023 dauerte. Dabei trafen sich führende Politiker aus aller Welt, um über dringende globale Themen wie den Klimawandel, die Wirtschaft und den Frieden zu diskutieren.
Die Veranstaltung fand in einer großen Konferenzhalle statt, die extra für diesen Anlass am 03.25.2023 eröffnet wurde. Dort hatten die Teilnehmer die Möglichkeit, sich über die neuesten Entwicklungen in ihren Ländern und Regionen auszutauschen und Lösungen für globale Probleme zu finden.
Am 03.30.2023 gab es eine wichtige Pressekonferenz, auf der die Ergebnisse der bisherigen Gespräche präsentiert wurden. Dabei wurden auch neue Initiativen und Projekte vorgestellt, die in den kommenden Jahren umgesetzt werden sollen.

Beachte: Die Datumsangaben sind in einem blöden Format! Darum ersetzen wir sie.

(C) Brandeis Consulting.

Beispiel eines Teilnehmers

create table vertraege (liefer_id nvarchar(30));
insert into vertraege values( 'IT1-20190203-1-INT1');
insert into vertraege values( 'IT1-20190203-1-INT2');
insert into vertraege values( 'IT1-20190203-2-INT10');
insert into vertraege values( 'IT1-20190203-2-INT1');
insert into vertraege values( 'IT1-20190203-2-EXT2');
insert into vertraege values( 'IT1-20190203-10-INT4');

select liefer_id, 
       to_int(SUBSTR_REGEXPR( '.*-.*-(.*)-.*' in liefer_id group 1 )) as sub,
       to_int(SUBSTR_REGEXPR( '.*INT(.*)' in liefer_id group 1 )) as sort_by
       from vertraege
       order by sub, 
                sort_by;

drop table vertraege;
(C) Brandeis Consulting.

„Normale“ Suche und Ersetzen in Zeichenketten

LOCATE(, , [ ], [] )
REPLACE( , , )

(C) Brandeis Consulting.

Bereinigen von Zeichenketten

Mit den TRIM-Funktionen können Zeichenmengen am Anfang oder am Ende einer Zeichnkette entfernt werden.

  • LTRIM(<Zeichenkette>[,<Zeichenmenge>])
  • RTRIM(<Zeichenkette>[,<Zeichenmenge>])
  • TRIM( [<Option>] <Zeichenmenge> FROM <Zeichenkette>)

Die TRIM-Funktionen entfernen manche Zeichen am Anfang oder Ende einer Zeichenkette. Der Defaultwert für die Zeichenmenge ist das Leerzeichen.

(C) Brandeis Consulting.

Auffüllen von Zeichenketten – ALPHA-Konvertierung

  • LPAD(<Zeichenkette>,<Länge>[,<Muster>])
  • RPAD(<Zeichenkette>,<Länge>[,<Muster>])

Die PAD-Funktionen füllen die Zeichenkette immer in der angegebenen Länge mit dem Muster auf. Das ist perfekt für schöne Materialnummern!

Alphakonvertierung

Die Alphakonvertierung füllt eine Zeichenkette dann und nur dann mit führenden Nullen 0 auf, wenn die Zeichenkette numerisch ist.

ABAP_ALPHANUM(<Zeichenkette>, <Länge>)

(C) Brandeis Consulting.

ASCII- und UNICODE-Konvertierung

  • UNICODE(<Zeichen>) liefert die Nummer des Zeichens in der Unicode Tabelle
  • NCHAR(<Nummer>) liefert das Zeichen mit der Nummer aus der Unicode-Tabelle

ASCII() und CHAR() machen das gleiche, nur für die sehr beschränkte ASCII Tabelle.

SELECT ascii('A')     AS char2ascii   ,
       char(65)       AS ascii2char    ,
       unicode('碼')  AS nchar2unicode,
       nchar('30908') AS unicode2nchar
   FROM dummy;
(C) Brandeis Consulting.