在PostgreSQL中获取个人姓氏的最可读方法
我只想得到我数据库中的人的姓氏。 如果我叫“约翰·麦卡因·威廉”,我想要“麦卡因·威廉”。 我发现这样做的方法是使用以下解决方案:在PostgreSQL中获取个人姓氏的最可读方法,postgresql,Postgresql,我只想得到我数据库中的人的姓氏。 如果我叫“约翰·麦卡因·威廉”,我想要“麦卡因·威廉”。 我发现这样做的方法是使用以下解决方案: RIGHT(person.name, length(person.name) - (length(split_part(person.name, ' ', 1)) + 1)) 这样,我得到整个字符串的长度,从名字中减去长度,得到姓氏-1的长度(这样就不会有空格作为第一个字母),然后用“RIGHT Function”来“剪切”字符串。但它不是很可读,而且很难看。有更
RIGHT(person.name, length(person.name) - (length(split_part(person.name, ' ', 1)) + 1))
这样,我得到整个字符串的长度,从名字中减去长度,得到姓氏-1的长度(这样就不会有空格作为第一个字母),然后用“RIGHT Function”来“剪切”字符串。但它不是很可读,而且很难看。有更好、更优雅的方法吗?那么:
array_to_string((regexp_split_to_array(name, '\s+'))[2:], ' ')
首先将名称转换为一个数组,每个单词有一个元素。然后它从第二个元素开始获取所有内容,并将数组转换回字符串。关于:
array_to_string((regexp_split_to_array(name, '\s+'))[2:], ' ')
首先将名称转换为一个数组,每个单词有一个元素。然后它从第二个元素开始获取所有内容,并将数组转换回字符串。使用
regexp\u matches
:
(regexp_匹配(名称,[^\s]+\s(+))[1]
正则表达式跳过一系列非空格字符,然后跳过空格,然后捕获剩下的任何字符,即原样的姓氏。表达式返回第一个捕获。如果
name
不包含姓氏,则表达式使用regexp\u匹配产生null
:
(regexp_匹配(名称,[^\s]+\s(+))[1]
正则表达式跳过一系列非空格字符,然后跳过空格,然后捕获剩下的任何字符,即原样的姓氏。表达式返回第一个捕获。如果name
不包含姓氏,则表达式将生成null