PostgreSQL: оценить подстроку внутри функции - PullRequest
0 голосов
/ 23 октября 2018

Я пытаюсь извлечь левую часть поля email на основе разделителя @.

Например, из следующего электронного письма: root@localhost Я хочу извлечь root.

Я написал:

select email, substr(email,1,strpos(email, '@')-1)
from user;

но получаю:

[22011] ERROR: negative substring length not allowed

Как сделать подстроку внутри функции?

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

когда вы используете функцию strpos, но не нашли символ в строке.

Я бы использовал функцию POSITION , чтобы получить чартерную позицию и сделать подстроку, чтобы получить значение,потому что, если он не найдет символ, он вернет 0 вместо ошибки.

CREATE TABLE T(
   email varchar(50)
);

insert into t values ('aa@gmmail.com');
insert into t values ('11.com');
insert into t values ('test@gmmail.com');

Запрос 1 :

select CASE WHEN POSITION('@' in email) > 0 THEN 
                 substr(email,1,POSITION('@' in email)-1)
            ELSE ''
            END
FROM T

Результаты :

| case |
|------|
|   aa |
|      |
| test |
0 голосов
/ 23 октября 2018

Обычно я решаю это, просто добавляя @ в конец:

select email, substr(email, 1, strpos(email || '@', '@') - 1)
from user;

Или одну из этих альтернатив:

select email, left(email, strpos(email || '@', '@') - 1)

select email, substring(email from '^[^@]*')
0 голосов
/ 23 октября 2018

Ваш код хорошо работает для действительных адресов электронной почты.Но если в ваших строках нет символов @, это не удастся.

Так что в вашей таблице могут быть недействительные адреса электронной почты.

demo: db <> fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...