如何从不像特定值的列中删除字符

时间:2018-09-07 05:50:32

标签: sql sql-server

我正在使用mssql环境,并且我已经在一个栏中上传了包含姓氏/名字/缩写的CSV文件。数据在格式方面相当混乱,但这是我必须要做的全部工作。我需要将姓名缩写提取到单独的列中,并且需要提取的格式是(示例);

  • JOHN B. SMITH
  • SMITH JOHN B.
  • B。约翰·史密斯

简单地说,首字母(B.)几乎可以在任何地方。对于其他一些名称,它是由点号分隔的多个字母(John b.l. Smith等)。将这些值(只是缩写)放入单独的列的最佳方法是什么? 问候

2 个答案:

答案 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;

enter image description here

Demo