Problem:
Hur man extraherar en delsträng från en sträng i PostgreSQL/MySQL
Exempel 1:
I emails tabell, det finns en e-postkolumn. Du vill visa de första sju tecknen i varje e-postmeddelande.
Tabellen ser ut så här:
| e-post |
|---|
| jake99@gmail.com |
| tamarablack@zoho.com |
| notine@yahoo.fr |
| jessica1995@onet.pl |
Lösning 1:
SELECT email, SUBSTRING(email, 1, 7) AS substring FROM emails;
En annan syntax:
SELECT email, SUBSTRING(email FROM 1 FOR 7) AS substring FROM emails;
Resultatet är:
| e-post | delsträng |
|---|---|
| jake99@gmail.com | jake99@ |
| tamarablack@zoho.com | tamarab |
| notine@yahoo.fr | notine@ |
| jessica1995@onet.pl | jessica |
Diskussion:
Använd SUBSTRING() fungera. Det första argumentet är strängen eller kolumnnamnet. Det andra argumentet är indexet för tecknet där delsträngen ska börja. Det tredje argumentet är längden på delsträngen.
Se upp! Till skillnad från vissa andra programmeringsspråk börjar indexen på 1 , inte 0. Det betyder att det första tecknet har index 1, det andra tecknet har index 2 osv.
SUBSTRING(email, 1, 7) kommer att returnera delsträngarna för värdena i e-postkolumnen som börjar i början av strängarna (första tecknet) och gå till sju tecken. Den andra notationen, SUBSTRING(email FROM 1 FOR 7) , gör exakt samma sak. Argumentet efter FROM är startindexet och argumentet efter FOR är delsträngens längd.
Det tredje argumentet för SUBSTRING() funktionen är valfri. Om du utelämnar den får du delsträngen som börjar vid indexet i det andra argumentet och går hela vägen upp till slutet av strängen. SUBSTRING(email, 1) returnerar hela strängen, precis som SUBSTRING(email FROM 1) .
Exempel 2:
Du vill visa delsträngen mellan index 2 och 6 (inklusive).
Lösning 2:
SELECT email, SUBSTRING(email, 2, 5) AS substring FROM emails;
En annan syntax:
SELECT
email,
SUBSTRING(email FROM POSITION('@' IN email)) AS substring
FROM emails;
Resultatet är:
| e-post | delsträng |
|---|---|
| jake99@gmail.com | @gmail.com |
| tamarablack@zoho.com | @zoho.com |
| notine@yahoo.fr | @yahoo.fr |
| jessica1995@onet.pl | @onet.pl |
Diskussion:
Du använder SUBSTRING() fungerar som i de tidigare exemplen. Den här gången letar du efter en specifik karaktär vars position kan variera från rad till rad. För att hitta indexet för det specifika tecknet kan du använda POSITION(character IN column) funktion, där tecken är det specifika tecken som du vill starta understrängen med (här, @ ) . Argumentkolumnen är column från vilken du vill hämta delsträngen; det kan också vara en bokstavlig sträng.
Om du vill att delsträngen ska gå hela vägen till slutet av den ursprungliga strängen, det tredje argumentet i SUBSTRING() funktionen (eller FOR argument) behövs inte. Annars bör det vara längden på delsträngen, eller så kan du beräkna det med POSITION() fungera. Du kanske också vill hämta en delsträng som inte slutar i slutet av strängen utan på något specifikt tecken, t.ex. före '.'. Här är ett exempel:
SELECT
email,
SUBSTRING(email, POSITION('@' IN email), POSITION('.' IN email) - POSITION('@' IN email)) AS substring
FROM emails;
En annan syntax:
SELECT
email,
SUBSTRING(email FROM POSITION('@' IN email) FOR POSITION('.' IN email) - POSITION('@' IN email)) AS substring
FROM emails;
Resultatet av denna fråga är:
| e-post | delsträng |
|---|---|
| jake99@gmail.com | @gmail |
| tamarablack@zoho.com | @zoho |
| notine@yahoo.fr | @yahoo |
| jessica1995@onet.pl | @onet |
Delen POSITION('.' IN email) - POSITION('@' IN email) beräknar helt enkelt längden på delsträngen.