Проблем:
Как да извлечете подниз от низ в PostgreSQL/MySQL
Пример 1:
В emails
таблица, има колона за имейл. Искате да покажете първите седем знака от всеки имейл.
Таблицата изглежда така:
имейл |
---|
[email protected] |
[email protected] |
[email protected] |
[email protected] |
Решение 1:
SELECT email, SUBSTRING(email, 1, 7) AS substring FROM emails;
Друг синтаксис:
SELECT email, SUBSTRING(email FROM 1 FOR 7) AS substring FROM emails;
Резултатът е:
имейл | подниз |
---|---|
[email protected] | jake99@ |
[email protected] | тамараб |
[email protected] | notine@ |
[email protected] | Джесика |
Дискусия:
Използвайте SUBSTRING()
функция. Първият аргумент е низът или името на колоната. Вторият аргумент е индексът на знака, от който трябва да започне поднизът. Третият аргумент е дължината на подниза.
Внимавай! За разлика от някои други езици за програмиране, индексите започват от 1 , а не 0. Това означава, че първият знак има индекс 1, вторият знак има индекс 2 и т.н.
SUBSTRING(email, 1, 7)
ще върне поднизовете на стойностите в колоната на имейла, които започват от началото на низовете (първият знак) и продължават до седем знака. Другата нотация, SUBSTRING(email FROM 1 FOR 7)
, прави точно същото. Аргументът след FROM
е началният индекс и аргументът след FOR
е дължината на подниз.
Третият аргумент на SUBSTRING()
функцията е по избор. Ако го пропуснете, ще получите поднизът, който започва от индекса във втория аргумент и стига чак до края на низа. SUBSTRING(email, 1)
ще върне целия низ, точно както SUBSTRING(email FROM 1)
.
Пример 2:
Искате да покажете подниз между индекси 2 и 6 (включително).
Решение 2:
SELECT email, SUBSTRING(email, 2, 5) AS substring FROM emails;
Друг синтаксис:
SELECT email, SUBSTRING(email FROM POSITION('@' IN email)) AS substring FROM emails;
Резултатът е:
имейл | подниз |
---|---|
[email protected] | @gmail.com |
[email protected] | @zoho.com |
[email protected] | @yahoo.fr |
[email protected] | @onet.pl |
Дискусия:
Използвате SUBSTRING()
функционират както в предишните примери. Този път търсите конкретен герой, чиято позиция може да варира от ред на ред. За да намерите индекса на конкретния знак, можете да използвате POSITION(character IN column)
функция, където символът е конкретният знак, от който искате да стартирате подниза (тук, @
) . Аргументната колона е column
от който искате да извлечете подниз; може да бъде и литерален низ.
Ако искате поднизът да отиде чак до края на оригиналния низ, третият аргумент в SUBSTRING()
функция (или FOR
аргумент) не е необходим. В противен случай трябва да е дължината на подниза или можете да го изчислите с помощта на POSITION()
функция. Може също да искате да извлечете подниз, който не завършва в края на низа, а с някакъв конкретен знак, например преди '.'. Ето един пример:
SELECT email, SUBSTRING(email, POSITION('@' IN email), POSITION('.' IN email) - POSITION('@' IN email)) AS substring FROM emails;
Друг синтаксис:
SELECT email, SUBSTRING(email FROM POSITION('@' IN email) FOR POSITION('.' IN email) - POSITION('@' IN email)) AS substring FROM emails;
Резултатът от тази заявка е:
имейл | подниз |
---|---|
[email protected] | @gmail |
[email protected] | @zoho |
[email protected] | @yahoo |
[email protected] | @onet |
Частта POSITION('.' IN email) - POSITION('@' IN email)
просто изчислява дължината на подниза.