从单列中分隔名字和姓氏

时间:2015-03-02 14:01:17

标签: sql postgresql substring delimiter

我有一个person表,其中name列包含名称,有些格式为"最后一个"和一些格式"第一"。

我的查询

SELECT name,
SUBSTRING(name FROM 1 FOR POSITION(' ' IN name) ) AS first_name
FROM person

创建一个新的名字行,但它不适用于只有名字且根本没有空格的名称。

我知道我需要一个类似CASE之类的0 = (' ', name)语句,但我一直遇到语法错误,并会很感激。

3 个答案:

答案 0 :(得分:3)

只需使用split_part()

SELECT split_part(name, ' ', 1) AS first_name
     , split_part(name, ' ', 2) AS last_name
FROM person;

SQL Fiddle.

相关:

答案 1 :(得分:0)

1

select 
 substring(name from '^([\w\-]+)') first_name,
 substring(name from '\s(\w+)$') last_name
from person

2

select (regexp_split_to_array(name, ' '))[1] first_name
     , (regexp_split_to_array(name, ' '))[2] last_name
from person

答案 2 :(得分:0)

Erwin和Danstopka都以自己的风格获得了最佳答案。我使用他们的方法扩展到我的用例,我们只在中间名存在的情况下才需要中间名。

-示例

WITH tablename( name )      AS 
     ( 
            SELECT 'Barn KE Roman' 
            UNION ALL 
            SELECT 'Utry Rita' 
            UNION ALL 
            SELECT 'Jam Ilya Dimo' 
     ) 
SELECT (Regexp_split_to_array(NAME, ' '))[1] first_name , ( 
       CASE 
              WHEN array_length(regexp_split_to_array(NAME, ' '),1) > 2 THEN (regexp_split_to_array(NAME, ' '))[2] 
       END ) middle_name , ( 
       CASE 
              WHEN array_length(regexp_split_to_array(NAME, ' '),1) > 2 THEN (regexp_split_to_array(NAME, ' '))[3] 
              ELSE (regexp_split_to_array(NAME, ' '))[2] 
       END ) last_name 
FROM   tablename

没什么特别的,我取每个数组的长度,检查数组是否超过3个单词,然后相应地确定中间名和姓氏。