从右侧开始选择人员姓名

时间:2016-09-27 19:07:07

标签: tsql ssrs-2008-r2

我知道如何在T-SQL中执行左,右和子字符串,但由于名称的长度不同,我很难提取下面人员的姓名。我可以使用任何想法或语法来提取名称?感谢

数据值:

581;#Jackson, Daniel H; 501;#Sims, Katy L; 606;#Lawrence, Jennifer O

3 个答案:

答案 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_nameyour_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;