从单列中分离名字和姓氏

Seperate first and last names from single column

我有一个 person table,其中 name 列包含名称,一些格式为 "first last",一些格式为 "first"。

我的查询

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

创建新的名字行,但它不适用于只有名字且根本没有空白 space 的名字。

我知道我需要一个 CASE 语句,其中包含 0 = (' ', name) 之类的内容,但我将 运行 保留为语法错误,希望得到一些指示。

只需使用split_part():

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

SQL Fiddle.

相关:

  • Split comma separated column data into additional columns

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

欧文和丹斯托普卡都有各自风格的最佳答案。我已经使用他们的方法扩展到我的用例,在该用例中我们只需要中间名(如果存在)。

--例子

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 个单词,然后相应地决定中间名和姓氏。