我的表中有一个列有1000个名字。我想通过以新格式拆分名称来创建一个新列:示例:
Santosh Kumar Yadav
应该是:
Santosh K Yadav
只有首字母和其他名称的中间名应该相同。
我该怎么做?
答案 0 :(得分:1)
如果你想要做的就是用Initial替换第二个名字。这是MySQL数据库的一个想法。
假设名称列的名称为name
&要放置数据的新列是formatted_name
。你可以试试这个。
UPDATE Users
SET formatted_name = REPLACE(
name,
SUBSTRING_INDEX(SUBSTRING_INDEX(name, ' ', 2), ' ', -1),
LEFT(SUBSTRING_INDEX(SUBSTRING_INDEX(name, ' ', 2), ' ', -1), 1)
);
答案 1 :(得分:0)
遵循Java中的解决方案
// get name from database and store in var1
String[] nameType = var1.split (' ');
// divide var1 into firstname middlename lastname by splitting name with 'space'
var1 = nameType [0] + ' ' + nameType [1].substring (0, 1) + ' ' + nameType [2];
// combine name types, but only first letter of middle name
// write var1 in database
答案 2 :(得分:0)
请尝试使用以下代码。它在SQL Server 2012中运行良好。
注意:这仅适用于包含3个部分的名称。
DECLARE @Table TABLE (Name Varchar(100))
INSERT INTO @Table
(Name)
VALUES
('Santhosh Kumar Yadav'),
('John Thomas Mathew'),
('Thomas Mathew John'),
('Mathew John Thomas'),
('John Mathew Thomas')
SELECT
SUBSTRING(Name,1,CHARINDEX(' ',Name)+1) +
REVERSE(SUBSTRING(REVERSE(Name),1,CHARINDEX(' ',REVERSE(Name)))) AS Name
FROM
@Table
答案 3 :(得分:0)
OP没有提到数据库供应商。 Oracle的示例版本:
with mynames (name) as
(select 'Santosh Kumar Yadav' from dual
union all
select 'Abc Defgh' from dual)
select
case when length(name) - length(replace(name, ' ', '')) + 1 < 3 then
name
else
regexp_replace(name,'(^| )([^ ])([^ ])*',' \2',2, 1)
end
from mynames
当字符串超过2个单词时,它仅替换字符串中的第二个单词。
答案 4 :(得分:0)
对于这个结果,如
'Santosh Kumar Yadav'成为'Santosh K Yadav'
。您应该创建一个转换
的函数从'Santosh Kumar Yadav'变成'Santosh K Yadav'
Automatic
将所有中间名转换为一个字符
答案 5 :(得分:-1)
试试这个: -
select substring('Santosh Kumar Yadav',1,charindex(' ','Santosh Kumar Yadav')+1) + reverse(substring(reverse('Santosh Kumar Yadav'),1,charindex(' ',reverse('Santosh Kumar Yadav'))))