【问题标题】:How to get initials easily out of text field using Postgres如何使用 Postgres 从文本字段中轻松获取首字母
【发布时间】:2015-10-23 21:41:58
【问题描述】:

我使用的是 Postgres 9.4 版,并且我在表中有一个 full_name 字段。

在某些情况下,我想在我的表中输入姓名的首字母而不是全名。

类似:

Name        | Initials
------------------------
Joe Blow    | J. B.  
Phil Smith  | P. S.  

full_name 字段是一个字符串值(显然),我认为最好的方法是将字符串拆分为一个数组 foreach 空间,即:

select full_name, string_to_array(full_name,' ') initials
from my_table

这会产生以下结果集:

Eric A. Korver;{Eric,A.,Korver}
Ignacio Bueno;{Ignacio,Bueno}
Igmar Mendoza;{Igmar,Mendoza}

现在,我唯一缺少的是如何遍历每个数组元素并从中提取第一个字符。我最终将使用substring() 来获取每个元素的初始字符 - 但是我只是被困在如何即时循环它们..

谁有一个简单的方法来解决这个问题?

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    unneststring_agg 一起使用:

    select full_name, string_agg(substr(initials, 1,1)||'.', ' ') initials
    from (
        select full_name, unnest(string_to_array(full_name,' ')) initials
        from my_table
        ) sub
    group by 1;
    
           full_name        |  initials   
    ------------------------+-------------
     Phil Smith             | P. S.
     Joe Blow               | J. B.
     Jose Maria Allan Pride | J. M. A. P.
     Eric A. Korver         | E. A. K.
    (4 rows)
    

    【讨论】:

      【解决方案2】:

      您还可以为此创建一个辅助函数,以防您想在多个查询中使用类似的逻辑。看看这个

      --
      -- Function to extract a person's initials from the full name.
      --
      
      DROP FUNCTION IF EXISTS get_name_initials(TEXT);
      
      CREATE OR REPLACE FUNCTION get_name_initials(full_name TEXT)
      RETURNS TEXT AS $$
      DECLARE 
          result TEXT :='';
          part VARCHAR :='';
      BEGIN
          FOREACH part IN ARRAY string_to_array($1, ' ') LOOP
              result :=  result || substr(part, 1, 1) || '.';
          END LOOP;
      
          RETURN result;
      END;
      $$ LANGUAGE plpgsql;
      

      现在您可以简单地使用这个function 来获取这样的缩写。

      SELECT full_name, get_name_initials(full_name) as initials
      FROM my_table;
      
      SELECT get_name_initials('Phil Smith'); -- Returns P. H. 
      SELECT get_name_initials('Joe Blow'); -- Returns J. B. 
      

      【讨论】:

        【解决方案3】:

        SqlFiddleDemo

        WITH add_id AS (
             SELECT n.*, row_number() OVER (ORDER BY "Name") AS id
             FROM names n
        ),
        split_names AS (
             SELECT id, regexp_split_to_table("Name", E'\\s+') AS single_name
             FROM add_id
        ),
        initials AS (
              SELECT id, left(single_name, 1) || '.' AS initial
              FROM split_names
        ),
        final AS (
              SELECT id, string_agg(initial, ' ')
              FROM initials
              GROUP BY id
        ) 
        SELECT a.*, f.*
        FROM add_id a
        JOIN final f USING (id)
        

        为了调试,我创建了Initial 以显示如何匹配string_agg

        |           Name | Initials | id | id | string_agg |
        |----------------|----------|----|----|------------|
        | Eric A. Korver | E. A. K. |  1 |  1 |   E. A. K. |
        |  Igmar Mendoza |    I. M. |  2 |  2 |      I. M. |
        |  Ignacio Bueno |    I. B. |  3 |  3 |      I. B. |
        |       Joe Blow |    J. B. |  4 |  4 |      J. B. |
        |     Phil Smith |    P. S. |  5 |  5 |      P. S. |
        

        经过一番努力,我得到了一个精简版SqlFiddleDemo

          SELECT "Name", string_agg(left(single_name, 1) || '.', '') AS Initials
          FROM (
                SELECT
                  "Name",
                  regexp_split_to_table("Name", E'\\s+') AS single_name
                FROM names
               ) split_names
          GROUP BY "Name"
        

        输出

        |           Name | initials |
        |----------------|----------|
        | Eric A. Korver |   E.K.A. |
        |  Igmar Mendoza |     M.I. |
        |  Ignacio Bueno |     I.B. |
        |       Joe Blow |     B.J. |
        |     Phil Smith |     P.S. |
        

        【讨论】:

          猜你喜欢
          • 2018-04-12
          • 2021-08-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-06
          • 2012-07-21
          相关资源
          最近更新 更多