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

问题描述 投票:1回答:2

我正在使用mssql环境,并且我已经在一列中上传了带有first / lastnames / initials的CSV文件。数据非常混乱,格式化,但这是我必须要处理的全部内容。我需要将首字母提取到一个单独的列中,我需要提取的格式是(示例);

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

简单地说,初始(B.)几乎可以在任何地方。对于其他一些名字,它是由点分隔的多个字母(john b.l.史密斯等)。将这些值(只是首字母)带入单独的列的最佳方法是什么?问候

sql sql-server
2个回答
1
投票

这是一个适用于任何长度和任何位置的首字母的解决方案。诀窍是反向操作字符串,找到点的位置,以及在该点之后出现的第一个空格的位置。为了处理初始名称的起始边缘情况,我在名称字符串的前面和末尾添加了人工空间。

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


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
© www.soinside.com 2019 - 2024. All rights reserved.