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
如果名字和姓氏的首字母相同,我想更改全名
这是我的代码:
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