我知道如何在T-SQL中执行左,右和子字符串,但由于名称的长度不同,我很难提取下面人员的姓名。我可以使用任何想法或语法来提取名称?感谢
数据值:
581;#Jackson, Daniel H; 501;#Sims, Katy L; 606;#Lawrence, Jennifer O
答案 0 :(得分:0)
您可以使用PATINDEX动态获取名称的长度,但它假定名称始终以相同的方式格式化。
以下是TSQL Select的示例,它将从您提供的数据中选择名字:
CREATE TABLE #Temp (
ID INT NOT NULL,
FullName VARCHAR(100)
)
INSERT #Temp VALUES (581, 'Jackson, Daniel H')
INSERT #Temp VALUES (606, 'Lawrence, Jennifer O')
SELECT ID, FullName , SUBSTRING(FullName, PATINDEX('%, % _', FullName) + 2,
PATINDEX('% _', FullName) - PATINDEX('%, %', FullName) - 2) FirstName
FROM #Temp
DROP TABLE #Temp
答案 1 :(得分:0)
我使用一个函数来拆分CSV-Strings:
create function Do_Split
(@InputString NVARCHAR(4000)
,@Delimiter NVARCHAR(50) = ';')
RETURNS @Items TABLE (Item NVARCHAR(4000)) AS
BEGIN --Function
IF (@Delimiter = ' ')
BEGIN
SET @Delimiter = ';'
SET @InputString = REPLACE(@InputString, ' ', @Delimiter)
END;
IF (@Delimiter IS NULL OR @Delimiter = '') SET @Delimiter = ';';
DECLARE @Item NVARCHAR(4000)
DECLARE @ItemList NVARCHAR(4000)
DECLARE @DelimIndex INT
SET @ItemList = @InputString;
SET @DelimIndex = CHARINDEX(@Delimiter, @ItemList, 0);
WHILE (@DelimIndex != 0)
BEGIN
SET @Item = SUBSTRING(@ItemList, 0, @DelimIndex);
INSERT INTO @Items VALUES (@Item);
-- Set @ItemList = @ItemList minus one less item
SET @ItemList = SUBSTRING(@ItemList, @DelimIndex+1, LEN(@ItemList)-@DelimIndex);
SET @DelimIndex = CHARINDEX(@Delimiter, @ItemList, 0);
END; -- End WHILE
IF @Item IS NOT NULL -- At least one delimiter was encountered in @InputString
BEGIN
SET @Item = @ItemList;
INSERT INTO @Items VALUES (@Item);
END;
ELSE -- No delimiters were encountered in @InputString, so just return @InputString
BEGIN
INSERT INTO @Items VALUES (@InputString);
END;
RETURN
END -- End Function
go
用法:
SELECT * FROM Do_Split('581;#Jackson, Daniel H; 501;#Sims, Katy L; 606;#Lawrence, Jennifer O',';');
结果:
581
#Jackson, Daniel H
501
#Sims, Katy L
606
#Lawrence, Jennifer O
答案 2 :(得分:0)
目前尚不清楚数据的外观,因为您的示例会在一行中连接多个值。
案例1
假设id
中有2列full_name
和your_table
。您有意添加了分号;
来区分列。在这种情况下,您可以使用函数RIGHT
获取全名的值。长度为full_name
减去1的长度,不包括#
。
--
-- id full_name
-- -- ---------
-- 581 #Jackson, Daniel H
-- 501 #Sims, Katy L
-- 606 #Lawrence, Jennifer O
--
SELECT RIGHT(full_name, LEN(full_name) - 1) AS full_name
FROM your_table;
案例2
如果上述解决方案不合适,我们将讨论另一个案例。假设content
中有1列your_table
和3行。分号;
位于content
的值内,需要明确处理。在这种情况下,您可以使用函数SUBSTRING
获取全名的值。全名将在char #
索引之后开始,并且可以使用CHARINDEX (Transact-SQL)获取此索引:
--
-- content
-- -------
-- 581;#Jackson, Daniel H
-- 501;#Sims, Katy L
-- 606;#Lawrence, Jennifer O
--
SELECT SUBSTRING(content, CHARINDEX('#', content) + 1, 1000) AS full_name
FROM your_table;