PostgreSQL:计算函数内部的子字符串

时间:2018-10-23 08:28:34

标签: sql postgresql substring

我试图基于分隔符email提取@字段的左侧。

例如,从以下电子邮件中:root@localhost我要提取root

我写道:

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

但我得到:

[22011] ERROR: negative substring length not allowed

如何在函数中创建子字符串?

3 个答案:

答案 0 :(得分:1)

您的代码适用于有效的电子邮件地址。但是,如果您的字符串中没有任何@个字符,则会失败。

因此,您表中的电子邮件地址可能无效。

demo: db<>fiddle

答案 1 :(得分:0)

使用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

Results

| case |
|------|
|   aa |
|      |
| test |

答案 2 :(得分:0)

我通常只需在末尾添加@即可解决此问题:

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

或以下替代方法之一:

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

select email, substring(email from '^[^@]*')