PostgreSQL中LEFT与RIGHT函数用@位置返回结果不一致咨询
问题原因解析
首先你搞混了RIGHT()函数的参数含义:
LEFT(string, n):从字符串左侧取前n个字符RIGHT(string, n):从字符串右侧取后n个字符
你用POSITION('@' IN email)作为RIGHT()的第二个参数,这个值是@在邮箱里从左数的位置(比如abc@xyz.com里@在第4位),RIGHT()会从邮箱末尾开始取对应数量的字符,结果自然和域名不沾边,而且每个邮箱的@位置不同,返回结果当然每条都不一样。
另外你的LEFT()其实也有小问题:LEFT(email, POSITION('@' IN email))会把@也包含进去(比如返回abc@而不是abc),正确的用户名提取应该是LEFT(email, POSITION('@' IN email) - 1)。
更简单的替代方案
PostgreSQL里直接用SPLIT_PART()拆分邮箱更省心,不用手动计算位置:
- 提取用户名:
SPLIT_PART(email, '@', 1) - 提取域名:
SPLIT_PART(email, '@', 2)
这个函数会按@把字符串拆成对应部分,直接取目标段即可,比用LEFT/RIGHT+POSITION的组合更简洁可靠。
内容的提问来源于stack exchange,提问作者Nathan
相关产品推荐
相关产品推荐

