我正在使用mssql环境,并且我已经在一个栏中上传了包含姓氏/名字/缩写的CSV文件。数据在格式方面相当混乱,但这是我必须要做的全部工作。我需要将姓名缩写提取到单独的列中,并且需要提取的格式是(示例);
简单地说,首字母(B.)几乎可以在任何地方。对于其他一些名称,它是由点号分隔的多个字母(John b.l. Smith等)。将这些值(只是缩写)放入单独的列的最佳方法是什么? 问候
答案 0 :(得分:1)
您可以尝试一下。
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
答案 1 :(得分:1)
这是一种适用于任何长度和任何位置的缩写的解决方案。诀窍是对 reverse 中的字符串进行操作,找到点的位置以及该点之后出现的第一个空格的位置。为了处理以全名开头的首字母的小写情况,我在名称字符串的开头和结尾添加了人工空格。
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;