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 |
---|
[email protected] |
[email protected] |
[email protected] |
[email protected] |
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 |
---|---|
[email protected] | jake99@ |
[email protected] | tamarab |
[email protected] | notine@ |
[email protected] | 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 |
---|---|
[email protected] | @gmail.com |
[email protected] | @zoho.com |
[email protected] | @yahoo.fr |
[email protected] | @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 |
---|---|
[email protected] | @gmail |
[email protected] | @zoho |
[email protected] | @yahoo |
[email protected] | @onet |
Delen POSITION('.' IN email) - POSITION('@' IN email)
beräknar helt enkelt längden på delsträngen.