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.

Siehe auch::

LEFT , RIGHT

Syntax

SUBSTR( <base_expr>, <start_expr> [ , <length_expr> ] )

SUBSTRING( <base_expr>, <start_expr> [ , <length_expr> ] )
Copy

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, nicht b.

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 zu length_expr Zeichen/Bytes zurückgegeben. Wenn length_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);
Copy
+-------------------------------+
| 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;
Copy
+------------+-------------+--------------+-----------+
| 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;
Copy
+---------+---------------------------------+--------------+-----------------+
| 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;
Copy
+---------+---------------------------------+-------------+
| 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;
Copy
+---------+--------------+-----------+
| 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;
Copy
+---------+--------------+-------------------------+
| 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;
Copy
+---------+-----------------+------+-------+-----+
| CUST_ID | ACTIVATION_DATE | YEAR | MONTH | DAY |
|---------+-----------------+------+-------+-----|
|       1 | 20210320        | 2021 | 03    | 20  |
|       2 | 20240509        | 2024 | 05    | 09  |
|       3 | 20191017        | 2019 | 10    | 17  |
+---------+-----------------+------+-------+-----+