Tsql 选择从右侧开始的人员姓名

Tsql 选择从右侧开始的人员姓名,tsql,ssrs-2008-r2,Tsql,Ssrs 2008 R2,我知道如何在T-SQL中执行左、右和子字符串,但是我很难只提取下面那个人的名字,因为名字的长度不一样。有什么想法或语法可以用来提取名字吗?谢谢 数据值: 581;#Jackson, Daniel H; 501;#Sims, Katy L; 606;#Lawrence, Jennifer O 您可以使用PATINDEX动态获取名称的长度,但它假定名称的格式始终相同 下面是一个TSQL Select示例,它将从您提供的数据中给出Select的名字: CREATE TABLE #Temp (

我知道如何在T-SQL中执行左、右和子字符串,但是我很难只提取下面那个人的名字,因为名字的长度不一样。有什么想法或语法可以用来提取名字吗?谢谢

数据值:

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

您可以使用PATINDEX动态获取名称的长度,但它假定名称的格式始终相同

下面是一个TSQL Select示例,它将从您提供的数据中给出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

我使用一个函数拆分CSV字符串:

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

不清楚您的数据是什么样子的,因为您的示例在一行中连接了多个值

案例1

假设您的\u表中有两列id和全名。分号;是您故意添加的,以区分列。在这种情况下,可以使用函数RIGHT获取全名的值。长度将是全名的长度减去1,其中不包括

案例2

如果上述解决方案不适用,让我们讨论另一种情况。假设您的_表中有1列内容和3行内容。分号;在内容的值内,需要显式处理。在这种情况下,可以使用函数SUBSTRING获取全名的值。全名将在char索引之后开始,该索引可通过以下方式获得:


数据值581的预期输出是什么;杰克逊,丹尼尔H,;501;西姆斯,凯蒂L;606;劳伦斯,詹妮弗·奥特?事实上这是一部精选的电影。我想知道除了LEFT、SUBSTRING或RIGHT之外,是否还有其他SQL语法。结果应该是姓、名和首字母;杰克逊,丹尼尔H;,501;西姆斯,凯蒂L;和606;劳伦斯,詹妮弗O?不清楚您使用的是哪个字段。我建议您通过添加原始查询并重新格式化输出数据值来编辑您的帖子。预期结果应为姓氏、名和中间首字母。上述解决方案有效!非常感谢你,敏聪。。简单代码..:好消息@Arsee!!能帮助你是我的荣幸。你能接受我的回答吗?我怎么接受你的回答?对不起,我已经熟悉了网站结构。没有pb@Arsee,您可以在这里查看:
--
-- 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;
--
-- 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;