我正在使用mssql环境,并且我已经在一列中上传了带有first / lastnames / initials的CSV文件。数据非常混乱,格式化,但这是我必须要处理的全部内容。我需要将首字母提取到一个单独的列中,我需要提取的格式是(示例);
简单地说,初始(B.)几乎可以在任何地方。对于其他一些名字,它是由点分隔的多个字母(john b.l.史密斯等)。将这些值(只是首字母)带入单独的列的最佳方法是什么?问候
这是一个适用于任何长度和任何位置的首字母的解决方案。诀窍是反向操作字符串,找到点的位置,以及在该点之后出现的第一个空格的位置。为了处理初始名称的起始边缘情况,我在名称字符串的前面和末尾添加了人工空间。
WITH yourTable AS (
SELECT 'JOHN B. SMITH' AS name UNION ALL
SELECT 'SMITH JOHN B.' UNION ALL
SELECT 'B. JOHN SMITH' UNION ALL
SELECT 'HARRY BP. POTTER' UNION ALL
SELECT 'AB. CHARLES ROGERS' UNION ALL
SELECT 'JOHN DENNIS HRM.'
),
newTable AS (
SELECT
name AS orig_name, -- original name
REVERSE(' ' + name + ' ') AS rev_name -- reverse name, WS padded at start/end
FROM yourTable
)
SELECT
orig_name AS name,
CASE WHEN orig_name LIKE '%.%'
THEN
REVERSE(SUBSTRING(rev_name,
CHARINDEX('.', rev_name) + 1,
CHARINDEX(' ', rev_name, CHARINDEX('.', rev_name)) -
CHARINDEX('.', rev_name) - 1))
ELSE 'NA' END AS initial
FROM newTable;
你可以试试这个。
DECLARE @T TABLE (Name VARCHAR(50))
INSERT INTO @T VALUES
('JOHN B. SMITH'),
('SMITH JOHN B.'),
('B. JOHN SMITH')
SELECT *, SUBSTRING(Name, CHARINDEX('.',Name)-1,1) INI
FROM @T
结果
Name INI
-------------------- ----
JOHN B. SMITH B
SMITH JOHN B. B
B. JOHN SMITH B