【问题标题】:Return first and last words in a person name - postgres返回人名中的第一个和最后一个单词 - postgres
【发布时间】:2014-03-12 00:24:40
【问题描述】:

我有一个姓名列表,我想将一个人姓名中的第一个单词和最后一个单词分开。

我试图使用“修剪”功能但没有成功。

谁能解释我该怎么做?

表:

Names 
Mary Johnson Angel Smith
Dinah Robertson Donald
Paul Blank Power Silver

那我想有一个结果:

Names
Mary Smith
Dinah Donald
Paul Silver

谢谢,

【问题讨论】:

  • 这基本上是一个无法解决的问题。 stackoverflow.com/questions/1122328/… trim() 对于这个问题真的没有意义。也许您可以向我们展示您的尝试 - 向我们展示代码! - 我们可以帮助您制作适合这组有限输入的东西。
  • 您要对查询执行此操作吗?用您的服务器端脚本语言(也许是 php?)很容易做到...查看explode()
  • A.O.我试图在 postgres 中做到这一点,但没有成功。我的意思是我尝试使用修剪,但它根本不起作用。您在 postgres 中是否还知道其他函数,例如:First("my string") 和 last("my string")?谢谢,
  • 您打算如何处理像João da Nova 这样的名称?姓氏是da Nova。或者许多其他姓氏包含空格的情况。说真的,不要尝试这样做,这是错误。 kalzumeus.com/2010/06/17/… 。区分名字和姓氏的唯一方法是询问姓名的人。即使这样,你也需要准备好让他们回答“嗯,我没有姓氏”或“嗯,我没有名字”。或“哪个姓氏,我有三个不同的姓氏”。还是“拼音还是简体字?”
  • @Craig:更不用说将姓氏放在给定名称之前的文化或像“Van Den Heuvel”这样的姓氏了。名字非常复杂。

标签: postgresql


【解决方案1】:

你可以简单地使用正则表达式来做到这一点,比如:

substring(trim(name) FROM '^([^ ]+)') || ' ' || substring(trim(name) FROM '([^ ]+)$')

当然,它只会在你 100% 的情况下工作,总是至少提供第一个 和 一个姓氏。我不是 100% 肯定世界上每个人都是如此。例如:这对中文名字有用吗?我不确定,我避免对人名做任何假设。最好是simply ask the user two fields,一个用于“姓名”,另一个用于“您希望如何称呼?”。

【讨论】:

  • Shiftplanning.com 最近做到了这一点。他们通过算法猜测人名,但要求他们确认/纠正。
【解决方案2】:

另一种方法,利用 Postgres 字符串处理内置函数:

SELECT split_part(name, ' ', 1) as first_token,
split_part(name, ' ', array_length(regexp_split_to_array(name, ' '), 1)) as last_token
FROM mytable          

【讨论】:

  • string_to_array() 就足够了,不需要正则表达式(regexp_split_to_array 比string_to_array() 慢很多)
【解决方案3】:

以下是我如何从带有点的电子邮件中提取全名,例如 Jeremy.Thompson@abc.com

SELECT split_part(email, '.', 1) || ' ' || replace(split_part(email, '.',  2), '@abc','')
FROM people   

结果:

杰里米   |汤普森


您可以轻松地将点替换为空格:

SELECT split_part(email, ' ', 1) || ' ' || replace(split_part(email, ' ',  2), '@abc','')
FROM people   

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 2010-12-15
    • 1970-01-01
    • 2017-02-13
    • 2015-04-03
    • 1970-01-01
    • 2015-10-09
    相关资源
    最近更新 更多