- Kategorien:
Zeichenfolgen- und Binärfunktionen (Abgleich/Vergleich)
SUBSTR , SUBSTRING¶
Gibt den Teil der Zeichenfolge oder des Binärwerts aus Ausdruck base_expr
zurück, beginnend mit dem durch Ausdruck start_expr
angegebenen Zeichen/Byte mit optional begrenzter Länge.
Diese Funktionen sind gleichbedeutend.
Syntax¶
SUBSTR( <base_expr>, <start_expr> [ , <length_expr> ] )
SUBSTRING( <base_expr>, <start_expr> [ , <length_expr> ] )
Argumente¶
base_expr
Ein Ausdruck, der einen VARCHAR- oder BINARY-Wert ergibt.
start_expr
Ein Ausdruck, der zu einer Ganzzahl ausgewertet wird. Sie gibt den Offset an, ab dem die Teilzeichenfolge beginnt. Der Offset wird gemessen in:
Die Anzahl von UTF-8 Zeichen, wenn die Eingabe ein VARCHAR-Wert ist.
Die Anzahl der Bytes, wenn die Eingabe ein BINARY-Wert ist.
Die Startposition ist 1-basiert, nicht 0-basiert. Zum Beispiel gibt
SUBSTR('abc', 1, 1)
a
zurück, nichtb
.length_expr
Ein Ausdruck, der zu einer Ganzzahl ausgewertet wird. Er legt Folgende fest:
Die Anzahl der zurückzugebenden UTF-8 Zeichen, wenn die Eingabe VARCHAR lautet.
Die Anzahl der zurückzugebenden Bytes, wenn die Eingabe BINARY ist.
Geben Sie eine Länge an, die größer als oder gleich Null ist. Wenn die Länge eine negative Zahl ist, gibt die Funktion eine leere Zeichenfolge zurück.
Rückgabewerte¶
Der Datentyp des zurückgegebenen Wertes ist derselbe wie der Datentyp von base_expr
(VARCHAR oder BINARY).
Wenn eine der Eingaben NULL ist, wird NULL zurückgegeben.
Nutzungshinweise¶
Wenn
length_expr
angegeben wird, werden bis zulength_expr
Zeichen/Bytes zurückgegeben. Wennlength_expr
nicht angegeben ist, werden alle Zeichen bis zum Ende der Zeichenfolge oder des binären Wertes zurückgegeben.Die Werte in
start_expr
beginnen bei 1:Wenn 0 angegeben ist, wird dies als 1 behandelt.
Wenn ein negativer Wert angegeben ist, wird die Startposition als
start_expr
Zeichen/Bytes vom Ende der Zeichenfolge oder des Binärwerts berechnet. Wenn sich die Position außerhalb des Bereichs einer Zeichenfolge oder eines Binärwerts befindet, wird ein leerer Wert zurückgegeben.
Sortierungsdetails¶
Sortierung gilt für VARCHAR-Eingaben. Die Sortierung wird nicht angewendet, wenn der Eingabedatentyp des ersten Parameters BINARY ist.
No impact. Obwohl die Sortierung syntaktisch akzeptiert wird, hat die Sortierung keinen Einfluss auf die Verarbeitung. So zählen zum Beispiel Sprachen mit zwei- und dreistellige Buchstaben (z. B. „dzs“ im Ungarischen oder „ch“ im Tschechischen) immer noch als zwei bzw. drei Zeichen (und nicht als ein Zeichen) für das Längenargument.
The collation of the result is the same as the collation of the input. Dies kann nützlich sein, wenn der zurückgegebene Wert als Teil verschachtelter Funktionsaufrufe an eine andere Funktion übergeben wird.
Beispiele¶
Die folgenden Beispiele verwenden die Funktion SUBSTR.
Grundlegendes Beispiel¶
Das folgende Beispiel verwendet die Funktion SUBSTR, um den Teil der Zeichenfolge zurückzugeben, der mit dem neunten Zeichen beginnt, und beschränkt die Länge des zurückgegebenen Wertes auf drei Zeichen:
SELECT SUBSTR('testing 1 2 3', 9, 3);
+-------------------------------+
| SUBSTR('TESTING 1 2 3', 9, 3) |
|-------------------------------|
| 1 2 |
+-------------------------------+
Festlegen unterschiedlicher Start- und Längenwerte¶
Das folgende Beispiel zeigt die Teilzeichenfolgen, die für dieselbe base_expr
zurückgegeben werden, wenn für start_expr
und length_expr
unterschiedliche Werte angegeben werden:
CREATE OR REPLACE TABLE test_substr (
base_value VARCHAR,
start_value INT,
length_value INT)
AS SELECT
column1,
column2,
column3
FROM
VALUES
('mystring', -1, 3),
('mystring', -3, 3),
('mystring', -3, 7),
('mystring', -5, 3),
('mystring', -7, 3),
('mystring', 0, 3),
('mystring', 0, 7),
('mystring', 1, 3),
('mystring', 1, 7),
('mystring', 3, 3),
('mystring', 3, 7),
('mystring', 5, 3),
('mystring', 5, 7),
('mystring', 7, 3),
('mystring', NULL, 3),
('mystring', 3, NULL);
SELECT base_value,
start_value,
length_value,
SUBSTR(base_value, start_value, length_value) AS substring
FROM test_substr;
+------------+-------------+--------------+-----------+
| BASE_VALUE | START_VALUE | LENGTH_VALUE | SUBSTRING |
|------------+-------------+--------------+-----------|
| mystring | -1 | 3 | g |
| mystring | -3 | 3 | ing |
| mystring | -3 | 7 | ing |
| mystring | -5 | 3 | tri |
| mystring | -7 | 3 | yst |
| mystring | 0 | 3 | mys |
| mystring | 0 | 7 | mystrin |
| mystring | 1 | 3 | mys |
| mystring | 1 | 7 | mystrin |
| mystring | 3 | 3 | str |
| mystring | 3 | 7 | string |
| mystring | 5 | 3 | rin |
| mystring | 5 | 7 | ring |
| mystring | 7 | 3 | ng |
| mystring | NULL | 3 | NULL |
| mystring | 3 | NULL | NULL |
+------------+-------------+--------------+-----------+
Rückgabe von Teilzeichenfolgen für E-Mail, Telefon und Datum¶
Die folgenden Beispiele geben Teilzeichenketten für Kundeninformationen in einer Tabelle zurück.
Erstellen Sie die Tabelle und fügen Sie Daten ein:
CREATE OR REPLACE TABLE customer_contact_example (
cust_id INT,
cust_email VARCHAR,
cust_phone VARCHAR,
activation_date VARCHAR)
AS SELECT
column1,
column2,
column3,
column4
FROM
VALUES
(1, 'some_text@example.com', '800-555-0100', '20210320'),
(2, 'some_other_text@example.org', '800-555-0101', '20240509'),
(3, 'some_different_text@example.net', '800-555-0102', '20191017');
SELECT * from customer_contact_example;
+---------+---------------------------------+--------------+-----------------+
| CUST_ID | CUST_EMAIL | CUST_PHONE | ACTIVATION_DATE |
|---------+---------------------------------+--------------+-----------------|
| 1 | some_text@example.com | 800-555-0100 | 20210320 |
| 2 | some_other_text@example.org | 800-555-0101 | 20240509 |
| 3 | some_different_text@example.net | 800-555-0102 | 20191017 |
+---------+---------------------------------+--------------+-----------------+
Verwenden Sie die Funktion POSITION mit der Funktion SUBSTR, um die Domänen aus E-Mail-Adressen zu extrahieren. Dieses Beispiel findet die Position von @
in jeder Zeichenfolge und beginnt mit dem nächsten Zeichen, indem es eins hinzufügt:
SELECT cust_id,
cust_email,
SUBSTR(cust_email, POSITION('@' IN cust_email) + 1) AS domain
FROM customer_contact_example;
+---------+---------------------------------+-------------+
| CUST_ID | CUST_EMAIL | DOMAIN |
|---------+---------------------------------+-------------|
| 1 | some_text@example.com | example.com |
| 2 | some_other_text@example.org | example.org |
| 3 | some_different_text@example.net | example.net |
+---------+---------------------------------+-------------+
Tipp
Sie können die Funktion POSITION verwenden, um die Position anderer Zeichen zu finden, z. B. ein leeres Zeichen (' '
) oder einen Unterstrich (_
).
In der Spalte cust_phone
in der Tabelle sind die ersten drei Zeichen immer die Vorwahl. Extrahieren Sie die Vorwahl aus Telefonnummern:
SELECT cust_id,
cust_phone,
SUBSTR(cust_phone, 1, 3) AS area_code
FROM customer_contact_example;
+---------+--------------+-----------+
| CUST_ID | CUST_PHONE | AREA_CODE |
|---------+--------------+-----------|
| 1 | 800-555-0100 | 800 |
| 2 | 800-555-0101 | 800 |
| 3 | 800-555-0102 | 800 |
+---------+--------------+-----------+
Entfernen Sie die Vorwahl von Telefonnummern:
SELECT cust_id,
cust_phone,
SUBSTR(cust_phone, 5) AS phone_without_area_code
FROM customer_contact_example;
+---------+--------------+-------------------------+
| CUST_ID | CUST_PHONE | PHONE_WITHOUT_AREA_CODE |
|---------+--------------+-------------------------|
| 1 | 800-555-0100 | 555-0100 |
| 2 | 800-555-0101 | 555-0101 |
| 3 | 800-555-0102 | 555-0102 |
+---------+--------------+-------------------------+
In der Spalte activation_date
in der Tabelle wird das Datum immer im Format YYYYMMDD
angezeigt. Extrahieren Sie das Jahr, den Monat und den Tag aus diesen Zeichenfolgen:
SELECT cust_id,
activation_date,
SUBSTR(activation_date, 1, 4) AS year,
SUBSTR(activation_date, 5, 2) AS month,
SUBSTR(activation_date, 7, 2) AS day
FROM customer_contact_example;
+---------+-----------------+------+-------+-----+
| CUST_ID | ACTIVATION_DATE | YEAR | MONTH | DAY |
|---------+-----------------+------+-------+-----|
| 1 | 20210320 | 2021 | 03 | 20 |
| 2 | 20240509 | 2024 | 05 | 09 |
| 3 | 20191017 | 2019 | 10 | 17 |
+---------+-----------------+------+-------+-----+