【问题标题】:sql - values after the 1st and 2nd spacesql - 第一个和第二个空格后的值
【发布时间】:2017-08-07 03:24:33
【问题描述】:

我想将一个字段分成 3 个部分,使用空格 ' '

示例

select name from nametable;

所有信息都在同一个字段中。例如'dr john smith''mrs jane smith'

我希望将结果分成 3 列:

select title, firstname, lastname from nametable

例如:

'dr' 作为标题,'john' 作为名字,'smith' 作为姓氏

'mrs' 作为标题,'jane' 作为名字,'smith' 作为姓氏

【问题讨论】:

  • 别忘了接受答案

标签: sql-server substring charindex


【解决方案1】:

你可以使用parsename()函数,像这样:

declare @name varchar(100) = 'Mr John Nash'

select  parsename(Replace(@name , ' ', '.'), 3) as title,
        parsename(Replace(@name, ' ', '.'), 2) as firstName,
        parsename(Replace(@name, ' ', '.'), 1) as lastName;

如果您的@name 中有句点,您可以使用这个:

declare @name varchar(100) = 'Mr. John Nash'


select  Replace(parsename(Replace(Replace(@name, '.', '*') , ' ', '.'), 3), '*', '.') as title,
        Replace(parsename(Replace(Replace(@name, '.', '*'), ' ', '.'), 2), '*', '.') as firstName,
        Replace(parsename(Replace(Replace(@name, '.', '*'), ' ', '.'), 1), '*', '.') as lastName;

在这里,您首先将. 替换为您从未见过的符号,例如*。最后,您再次将 * 替换为 .

【讨论】:

  • 这确实有一个缺陷,如果名称包含超过3个空格或包含句点+3个空格,它将找不到任何内容。 '先生。约翰纳什'。如果它包含句点,它将返回错误的结果
  • 我猜你的意思是 2 个空格。问题说它只有 3 列:标题、名字、姓氏。在此期间,我将添加一个简单的解决方案。 @t-clausen.dk
  • 不,我的意思是 3 个空格。简单的解决方案是用不同的值替换句点并在解析名称之后替换它
  • @t-clausen.dk 我不明白,你能举个例子吗?如果您的意思是开头或结尾的空格,那么他需要简单地修剪它。如果您的意思是可能有中间名,那么问题会很模糊,因为它没有指定天气,我们应该将中间名放在 firstName 列或 lastName 列中。
  • 如果数据包含超过 3 个句点,则 parsename 不返回任何内容。另一个问题是我如何在第二和第三空间之间分割(应该可能在第一和第二之间)。您从数据末尾开始以相反的顺序拆分空格。考虑数据“Thomas Hans Clausen 先生。应该返回:title=mr - firstname=Thomas - lastname=Hans Clausen。虽然数据可能没有那么复杂
猜你喜欢
  • 2015-06-06
  • 2022-01-13
  • 2013-05-05
  • 2021-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-09
相关资源
最近更新 更多