【问题标题】:Seperate first and last names from single column从单列中分离名字和姓氏
【发布时间】:2015-05-02 21:58:04
【问题描述】:

我有一个person 表,其中name 列包含名称,有些采用“first last”格式,有些采用“first”格式。

我的查询

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

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

我知道我需要一个带有 0 = (' ', name) 之类的 CASE 语句,但我一直遇到语法错误,希望得到一些指点。

【问题讨论】:

    标签: sql postgresql substring delimiter


    【解决方案1】:

    只需使用split_part():

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

    SQL Fiddle.

    相关:

    【讨论】:

      【解决方案2】:

      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
      

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-22
          • 1970-01-01
          • 2015-12-21
          • 1970-01-01
          相关资源
          最近更新 更多