T-SQL 中的子串

Substring in T-SQL

如果名字和姓氏的首字母相同,我想更改全名

这是我的代码:

SELECT 
    Id, FName + ' ' + LName 'Full Name',
    SUBSTRING(LTRIM(RTRIM(FName)), 1, 1) + '. ' + LTRIM(RTRIM(LName)) 'Short Name'
FROM 
    testMe

输出:

    Full Name       Short Name      Desired Result
1   John Smith      J. Smith          John Smith 
2   Jack Smith      J. Smith          Jack Smith
3   Jule Smith      J. Smith          Jule Smith
4   Paul Smith      P. Smith          P. Smith  
5   Steve Mark      S. Mark           S. Mark
6   Ashley  Howard  A. Howard         Ashley Howard
7   Adam Campbell   A. Campbell       Adam Campbell
8   Alex Campbell   A. Campbell       Alex Campbell

illustration:_

的屏幕截图

您可以使用 window 函数计算短名称

select  [Full Name]
  , case when count(*) over(partition by Short_Name) >1 then [Full Name] else Short_Name end Short_Name
from(
    SELECT 
        FName, FName + ' ' + LName [Full Name],
        SUBSTRING(LTRIM(RTRIM(FName)), 1, 1) + '. ' + LTRIM(RTRIM(LName)) Short_Name
    FROM 
        testMe
) t

很难准确地说出您需要什么,但也许 CASE 语句会有所帮助:

SELECT  
    CASE
        WHEN LEFT(LTRIM(RTRIM(FName)), 1) = LEFT(LTRIM(RTRIM(LName)), 1 ) THEN SUBSTRING(LTRIM(RTRIM(FName)), 1, 1) + '. ' + LTRIM(RTRIM(LName))
        ELSE FName + ' ' + LName
    END As FullName

第一个CASE条件是名字的第一个字母=姓氏的第一个字母。第二个条件是它们不匹配。

我想我知道你需要什么。如果我没猜错的话…… 试试这个:

 DECLARE        @Name   TABLE (ID int, FName varchar(50), LName varchar(50))
 INSERT INTO    @Name   VALUES
                (1, 'John'  ,   'Smith'   )
            ,   (2, 'Jack'  ,   'Smith'   )
            ,   (3, 'Jule'  ,   'Smith'   )
            ,   (4, 'Paul'  ,   'Smith'   )
            ,   (5, 'Steve' ,   'Mark'    )
            ,   (6, 'Ashley',   'Howard'  )
            ,   (7, 'Adam'  ,   'Campbell')
            ,   (8, 'Alex'  ,   'Campbell')
;

WITH    DupFNameFirst   AS
    (
        SELECT
                FName   =   MAX(FName)
            ,   Qty     =   SUM(1)
        FROM    @Name
        GROUP BY LEFT(FName, 1) + LName
    )
,   DupLName    AS
    (
        SELECT
                LName   
            ,   Qty =   SUM(1)
        FROM    @Name
        GROUP BY LName
    )
,       FinalName   AS
    (
        SELECT
                ID
            ,   FullName    =   FName           + ' '   + LName
            ,   ShortName   =   LEFT(FName,1)   + '. '  + LName
            ,   FName
            ,   LName
        FROM    @Name
    )

        SELECT
                    ID
                ,   FullName    
                ,   ShortName   
                ,   DesiredName =   CASE WHEN F.Qty = 1 OR D.Qty = 1 THEN N.ShortName ELSE N.FullName END
        FROM        FinalName       N
        LEFT  JOIN  DupFNameFirst   F   ON  F.FName = N.FName
        INNER JOIN  DupLName        D   ON  D.LName = N.LName
        ORDER BY ID