【问题标题】:How to get middle portion from Sql server table data?如何从 Sql server 表数据中获取中间部分?
【发布时间】:2016-03-14 21:11:24
【问题描述】:

我正在尝试从员工表中获取名字,在员工表中 full_name 是这样的:Dow,Mike P。

我尝试使用以下语法获取名字,但它带有中间名首字母 - 如果有的话,如何从名字中删除中间名首字母。因为并非所有名称都包含中间初始值。

--查询--

select  Employee_First_Name as full_name, 
        SUBSTRING(
            Employee_First_Name, 
            CHARINDEX(',', Employee_First_Name) + 1,                
            len(Employee_First_Name)) AS FirstName 
        ---> remove middle initial from right side from employee

--结果

Full_name Firstname Dow,Mike P. Mike P.

--全名数据的几个例子--

smith,joe j. --->joe (need result as)

smith,alan ---->alan (need result as)

【问题讨论】:

标签: sql sql-server substring charindex


【解决方案1】:

如果此 full_name 字段的格式对于所有行都相同,则您可以利用 SQL FTS 分词器的功能来完成此任务:

SELECT N'Dow, Mike P.' AS full_name INTO #t

SELECT display_term FROM #t
CROSS APPLY sys.dm_fts_parser(N'"' + full_name + N'"', 1033, NULL, 1) p
WHERE occurrence = 2

DROP TABLE #t

【讨论】:

    【解决方案2】:

    说实话,这最容易用多层次的逻辑来表达。一种方法是使用outer apply

    select ttt.firstname
    from t outer apply
         (select substring(t.full_name, charindex(', ', t.full_name) + 2, len(t.full_name) as firstmi
         ) tt outer apply
         (select (case when tt.firstmi like '% %'
                       then left(tt.firstmi, charindex(' ', tt.firstmi)
                       else tt.firstmi
                  end) as firstname
         ) as ttt
    

    如果你想把这一切放在一个复杂的语句中,我会建议一个计算列:

    alter table t
        add firstname as (stuff((case when full_name like '%, % %.',
                                      then left(full_name, 
                                                charindex(' ', full_name, charindex(', ', full_name) + 2)
                                               )
                                      else full_name
                                 end),
                                1,
                                charindex(', ', full_name) + 2,
                                '')
    

    【讨论】:

      【解决方案3】:

      这会删除逗号之前的部分。然后使用该字符串并删除空格之后的所有内容。

      WITH cte AS (
          SELECT * 
          FROM (VALUES('smith,joe j.'),('smith,alan'),('joe smith')) t(fullname)
      )
      
      SELECT
          SUBSTRING(
              LTRIM(SUBSTRING(fullname,CHARINDEX(',',fullname) + 1,LEN(fullname))),
              0,
              COALESCE(NULLIF(CHARINDEX(' ',LTRIM(SUBSTRING(fullname,CHARINDEX(',',fullname) + 1,LEN(fullname)))),0),LEN(fullname)))
      FROM cte
      
      output
      ------
      joe
      alan
      joe
      

      【讨论】:

        【解决方案4】:

        您需要再次使用charindex,而不是指定len,但指定您希望第二次出现空格。

        select  Employee_First_Name as full_name, 
                SUBSTRING(
                    Employee_First_Name, 
                    CHARINDEX(',', Employee_First_Name) + 1,                
                    CHARINDEX(' ', Employee_First_Name, 2)) AS FirstName 
        

        需要注意的是,第二个charindex如果没有第二次出现,可以返回0。在这种情况下,您可能需要使用以下内容:

        select  Employee_First_Name as full_name, 
                SUBSTRING(
                    Employee_First_Name, 
                    CHARINDEX(',', Employee_First_Name) + 1,                
                    IIF(CHARINDEX(' ', Employee_First_Name, 2) = 0, Len(Employee_First_name), CHARINDEX(' ', Employee_First_Name, 2))) AS FirstName 
        

        【讨论】:

          猜你喜欢
          • 2011-08-18
          • 2013-02-20
          • 1970-01-01
          • 2010-11-13
          • 2012-01-21
          • 1970-01-01
          • 1970-01-01
          • 2023-03-05
          • 1970-01-01
          相关资源
          最近更新 更多