sql >> Databasteknik >  >> RDS >> Mysql

Hur man extraherar en delsträng från en sträng i PostgreSQL/MySQL

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.


  1. Hur genererar man en GUID i Oracle?

  2. Skaffa id för en infogning i samma uttalande

  3. SQL, hur sammanfogar man resultat?

  4. Varför ger mig alla resultat att använda ett Understreck i ett LIKE-filter?