Problem:
Sådan udtrækkes en understreng fra en streng i PostgreSQL/MySQL
Eksempel 1:
I emails
tabel, er der en e-mail-kolonne. Du vil gerne vise de første syv tegn i hver e-mail.
Tabellen ser således ud:
[email protected] |
[email protected] |
[email protected] |
[email protected] |
Løsning 1:
SELECT email, SUBSTRING(email, 1, 7) AS substring FROM emails;
En anden syntaks:
SELECT email, SUBSTRING(email FROM 1 FOR 7) AS substring FROM emails;
Resultatet er:
understreng | |
---|---|
[email protected] | jake99@ |
[email protected] | tamarab |
[email protected] | notine@ |
[email protected] | jessica |
Diskussion:
Brug SUBSTRING()
fungere. Det første argument er strengen eller kolonnenavnet. Det andet argument er indekset for det tegn, hvor understrengen skal begynde. Det tredje argument er længden af understrengen.
Pas på! I modsætning til nogle andre programmeringssprog starter indeksene ved 1 , ikke 0. Det betyder, at det første tegn har indeks 1, det andet tegn har indeks 2 osv.
SUBSTRING(email, 1, 7)
returnerer understrengene af værdierne i e-mail-kolonnen, der starter i begyndelsen af strengene (første tegn) og går efter syv tegn. Den anden notation, SUBSTRING(email FROM 1 FOR 7)
, gør præcis det samme. Argumentet efter FROM
er startindekset og argumentet efter FOR
er understrengens længde.
Det tredje argument for SUBSTRING()
funktion er valgfri. Hvis du udelader det, får du den understreng, der starter ved indekset i det andet argument og går helt op til slutningen af strengen. SUBSTRING(email, 1)
returnerer hele strengen, ligesom SUBSTRING(email FROM 1)
.
Eksempel 2:
Du vil gerne vise understrengen mellem indeks 2 og 6 (inklusive).
Løsning 2:
SELECT email, SUBSTRING(email, 2, 5) AS substring FROM emails;
En anden syntaks:
SELECT email, SUBSTRING(email FROM POSITION('@' IN email)) AS substring FROM emails;
Resultatet er:
understreng | |
---|---|
[email protected] | @gmail.com |
[email protected] | @zoho.com |
[email protected] | @yahoo.fr |
[email protected] | @onet.pl |
Diskussion:
Du bruger SUBSTRING()
fungerer som i de foregående eksempler. Denne gang leder du efter en bestemt karakter, hvis position kan variere fra række til række. For at finde indekset for det specifikke tegn, kan du bruge POSITION(character IN column)
funktion, hvor tegn er det specifikke tegn, hvor du vil starte understrengen (her, @
). Argumentkolonnen er column
hvorfra du gerne vil hente understrengen; det kan også være en bogstavelig streng.
Hvis du ønsker, at understrengen skal gå helt til slutningen af den oprindelige streng, er det tredje argument i SUBSTRING()
funktionen (eller FOR
argument) er ikke nødvendig. Ellers skal det være længden af understrengen, eller du kan beregne det ved hjælp af POSITION()
fungere. Du vil måske også hente en understreng, der ikke ender i slutningen af strengen, men med et bestemt tegn, f.eks. før '.'. Her er et eksempel:
SELECT email, SUBSTRING(email, POSITION('@' IN email), POSITION('.' IN email) - POSITION('@' IN email)) AS substring FROM emails;
En anden syntaks:
SELECT email, SUBSTRING(email FROM POSITION('@' IN email) FOR POSITION('.' IN email) - POSITION('@' IN email)) AS substring FROM emails;
Resultatet af denne forespørgsel er:
understreng | |
---|---|
[email protected] | @gmail |
[email protected] | @zoho |
[email protected] | @yahoo |
[email protected] | @onet |
Delen POSITION('.' IN email) - POSITION('@' IN email)
beregner blot længden af understrengen.