Probleem:
Een subtekenreeks extraheren uit een tekenreeks in PostgreSQL/MySQL
Voorbeeld 1:
In de emails
tabel, is er een e-mailkolom. U wilt de eerste zeven tekens van elke e-mail weergeven.
De tabel ziet er als volgt uit:
[email protected] |
[email protected] |
[email protected] |
[email protected] |
Oplossing 1:
SELECT email, SUBSTRING(email, 1, 7) AS substring FROM emails;
Een andere syntaxis:
SELECT email, SUBSTRING(email FROM 1 FOR 7) AS substring FROM emails;
Het resultaat is:
subtekenreeks | |
---|---|
[email protected] | jake99@ |
[email protected] | tamarab |
[email protected] | notine@ |
[email protected] | jessica |
Discussie:
Gebruik de SUBSTRING()
functie. Het eerste argument is de tekenreeks of de kolomnaam. Het tweede argument is de index van het teken waarop de substring moet beginnen. Het derde argument is de lengte van de substring.
Kijk uit! In tegenstelling tot sommige andere programmeertalen, de indexen beginnen bij 1 , niet 0. Dit betekent dat het eerste teken index 1 heeft, het tweede teken index 2, enz.
SUBSTRING(email, 1, 7)
retourneert de subtekenreeksen van de waarden in de e-mailkolom die beginnen aan het begin van de tekenreeksen (eerste teken) en zeven tekens bevatten. De andere notatie, SUBSTRING(email FROM 1 FOR 7)
, doet precies hetzelfde. Het argument na de FROM
is de startindex, en het argument na de FOR
is de lengte van de substring.
Het derde argument van de SUBSTRING()
functie is optioneel. Als je het weglaat, krijg je de substring die begint bij de index in het tweede argument en helemaal doorloopt tot het einde van de string. SUBSTRING(email, 1)
zal de hele string teruggeven, net zoals SUBSTRING(email FROM 1)
.
Voorbeeld 2:
U wilt de subtekenreeks tussen indexen 2 en 6 (inclusief) weergeven.
Oplossing 2:
SELECT email, SUBSTRING(email, 2, 5) AS substring FROM emails;
Een andere syntaxis:
SELECT email, SUBSTRING(email FROM POSITION('@' IN email)) AS substring FROM emails;
Het resultaat is:
subtekenreeks | |
---|---|
[email protected] | @gmail.com |
[email protected] | @zoho.com |
[email protected] | @yahoo.fr |
[email protected] | @onet.pl |
Discussie:
Je gebruikt de SUBSTRING()
functioneren zoals in de vorige voorbeelden. Deze keer ben je op zoek naar een specifiek personage waarvan de positie van rij tot rij kan verschillen. Om de index van het specifieke teken te vinden, kunt u de POSITION(character IN column)
gebruiken functie, waarbij teken het specifieke teken is waarmee u de subtekenreeks wilt starten (hier @
). De argumentkolom is de column
waarvan u de substring wilt ophalen; het kan ook een letterlijke tekenreeks zijn.
Als je wilt dat de substring helemaal naar het einde van de originele string gaat, het derde argument in de SUBSTRING()
functie (of de FOR
argument) is niet nodig. Anders zou het de lengte van de substring moeten zijn, of je kunt het berekenen met de POSITION()
functie. U wilt misschien ook een subtekenreeks ophalen die niet aan het einde van de tekenreeks eindigt, maar op een specifiek teken, bijvoorbeeld vóór '.'. Hier is een voorbeeld:
SELECT email, SUBSTRING(email, POSITION('@' IN email), POSITION('.' IN email) - POSITION('@' IN email)) AS substring FROM emails;
Een andere syntaxis:
SELECT email, SUBSTRING(email FROM POSITION('@' IN email) FOR POSITION('.' IN email) - POSITION('@' IN email)) AS substring FROM emails;
Het resultaat van deze zoekopdracht is:
subtekenreeks | |
---|---|
[email protected] | @gmail |
[email protected] | @zoho |
[email protected] | @yahoo |
[email protected] | @onet |
Het deel POSITION('.' IN email) - POSITION('@' IN email)
berekent eenvoudig de lengte van de substring.