Problém:
Jak extrahovat podřetězec z řetězce v PostgreSQL/MySQL
Příklad 1:
V emails
tabulka, je tam sloupec email. Chcete zobrazit prvních sedm znaků každého e-mailu.
Tabulka vypadá takto:
[email protected] |
[email protected] |
[email protected] |
[email protected] |
Řešení 1:
SELECT email, SUBSTRING(email, 1, 7) AS substring FROM emails;
Další syntaxe:
SELECT email, SUBSTRING(email FROM 1 FOR 7) AS substring FROM emails;
Výsledek je:
podřetězec | |
---|---|
[email protected] | jake99@ |
[email protected] | tamarab |
[email protected] | notine@ |
[email protected] | jessica |
Diskuse:
Použijte SUBSTRING()
funkce. Prvním argumentem je řetězec nebo název sloupce. Druhý argument je index znaku, na kterém by měl podřetězec začínat. Třetí argument je délka podřetězce.
Dávej si pozor! Na rozdíl od některých jiných programovacích jazyků indexy začínají na 1 , nikoli 0. To znamená, že první znak má index 1, druhý znak má index 2 atd.
SUBSTRING(email, 1, 7)
vrátí podřetězce hodnot ve sloupci e-mailu, které začínají na začátku řetězce (první znak) a mají sedm znaků. Druhý zápis, SUBSTRING(email FROM 1 FOR 7)
, dělá úplně to samé. Argument za FROM
je počáteční index a argument za FOR
je délka podřetězce.
Třetí argument funkce SUBSTRING()
funkce je volitelná. Pokud jej vynecháte, získáte podřetězec, který začíná na indexu ve druhém argumentu a pokračuje až na konec řetězce. SUBSTRING(email, 1)
vrátí celý řetězec, stejně jako SUBSTRING(email FROM 1)
.
Příklad 2:
Chcete zobrazit podřetězec mezi indexy 2 a 6 (včetně).
Řešení 2:
SELECT email, SUBSTRING(email, 2, 5) AS substring FROM emails;
Další syntaxe:
SELECT email, SUBSTRING(email FROM POSITION('@' IN email)) AS substring FROM emails;
Výsledek je:
podřetězec | |
---|---|
[email protected] | @gmail.com |
[email protected] | @zoho.com |
[email protected] | @yahoo.fr |
[email protected] | @onet.pl |
Diskuse:
Používáte SUBSTRING()
fungovat jako v předchozích příkladech. Tentokrát hledáte konkrétní postavu, jejíž pozice se může lišit řádek od řádku. Chcete-li najít index konkrétního znaku, můžete použít POSITION(character IN column)
funkce, kde znak je konkrétní znak, kterým chcete začínat podřetězec (zde @
). Sloupec argumentu je column
ze kterého chcete získat podřetězec; může to být také doslovný řetězec.
Pokud chcete, aby podřetězec šel až na konec původního řetězce, třetí argument v SUBSTRING()
funkce (nebo FOR
argument) není potřeba. Jinak by to měla být délka podřetězce, nebo ji můžete vypočítat pomocí POSITION()
funkce. Můžete také chtít načíst podřetězec, který nekončí na konci řetězce, ale na určitém konkrétním znaku, např. před '.'. Zde je příklad:
SELECT email, SUBSTRING(email, POSITION('@' IN email), POSITION('.' IN email) - POSITION('@' IN email)) AS substring FROM emails;
Další syntaxe:
SELECT email, SUBSTRING(email FROM POSITION('@' IN email) FOR POSITION('.' IN email) - POSITION('@' IN email)) AS substring FROM emails;
Výsledek tohoto dotazu je:
podřetězec | |
---|---|
[email protected] | @gmail |
[email protected] | @zoho |
[email protected] | @yahoo |
[email protected] | @onet |
Část POSITION('.' IN email) - POSITION('@' IN email)
jednoduše vypočítá délku podřetězce.