Sql 变长子串

Sql 变长子串,sql,sql-server,sql-server-2012,substring,Sql,Sql Server,Sql Server 2012,Substring,我有一个包含如下字符串的列的表 RTSPP_LZ_AEN RTSPP_LZ_CPS RTSPP_LZ_HOUSTON RTSPP_LZ_LCRA RTSPP_LZ_NORTH RTSPP_LZ_RAYBN RTSPP_LZ_SOUTH RTSPP_LZ_WEST RTSPP_BTE_CC1 RTSPP_BTE_PUN1 RTSPP_BTE_PUN2 我需要从第二次出现的\uu到字符串的末尾获取子字符串,正如您所看到的,子字符串不是固定长度的。第一部分并不总是固定的,它可以改变。到目前为止,

我有一个包含如下字符串的列的表

RTSPP_LZ_AEN
RTSPP_LZ_CPS
RTSPP_LZ_HOUSTON
RTSPP_LZ_LCRA
RTSPP_LZ_NORTH
RTSPP_LZ_RAYBN
RTSPP_LZ_SOUTH
RTSPP_LZ_WEST
RTSPP_BTE_CC1 
RTSPP_BTE_PUN1 
RTSPP_BTE_PUN2
我需要从第二次出现的
\uu
到字符串的末尾获取子字符串,正如您所看到的,子字符串不是固定长度的。第一部分并不总是固定的,它可以改变。到目前为止,我正在使用以下代码来实现它

SELECT SUBSTRING([String],CHARINDEX('_',[String],(CHARINDEX('_',[String])+1))+1,100)
FROM [Table]
如您所见,我使用任意大的值作为长度来处理可变长度。有更好的方法吗?

您可以尝试将len([string])作为最后一个参数:

 SELECT SUBSTRING([String],CHARINDEX('_',[String],(CHARINDEX('_',[String])+1))+1,len([string])) FROM [Table]
或者,甚至这个:

SELECT SUBSTRING([String],CHARINDEX('_',[String],(CHARINDEX('_',[String])+1))+1,
             LEN([String])-CHARINDEX('_',[String])+1)

您可以将
CHARINDEX
与函数结合使用来查找上次出现的
\
,并且可以使用从字符串末尾获取指定数量的字符

SELECT RIGHT([String],CHARINDEX('_',REVERSE([String]),0)-1)

您可以使用一个通用的表表达式来完成如下代码所示的工作。增加了获取所有子字符串的灵活性,无论字符串中有多少下划线

;WITH cte AS (
    SELECT 
      0 AS row
      ,CHARINDEX('_', [String]) pos
      ,[String] 
    FROM [Table]
    UNION ALL
    SELECT 
      row + 1
      ,CHARINDEX('_', [String], pos + 1)
      ,[String]
    FROM cte
    WHERE pos > 0
)
SELECT 
    row
    ,[String]
    ,pos
    ,SUBSTRING([String], pos + 1, LEN([String]) -pos)
FROM cte 
WHERE pos > 0
-- Remove line below to see all possible substrs
  AND row = 1
ORDER BY 
  [String], pos
我觉得这很好:

declare @yourvariable nvarchar(max)

set @yourvariable=(Select
(SELECT  distinct ','+yourcolumn
from yourtable 
for xml path('')) )

select substring(@yourvariable,2,len(@yourvariable))

此外,这似乎更为简洁和一致:

Select substring(yourtemp.yourcolumn,2,len(yourtemp.yourcolumn)) as yourcolumn
from(
select(
SELECT  distinct ','+yourcolumn
from yourtable
for xml path('') ) as yourcolumn) as yourtemp

是否总是有2个下划线?第一部分总是RTSPP_LZ_?还是可以有其他值?@AaronBertrand到目前为止,我还没有遇到超过2个下划线的情况。在这种情况下,将来可能会出现直到字符串结尾的最后一个下划线。可以处理第n次出现下划线的更通用的解决方案将非常有用appreciated@NenadZivkovic不总是这样,他们可以像RTSPP_BTE_CC1 RTSPP_BTE_PUN1 RTSPP_BTE_PUN2+1一样改变。谢谢你的回答,它甚至可以处理零下划线的情况,但我不能使用CTE,因为这是一个更大系统的一小部分查询简单解决方案和演示+1感谢您提及len([string])。我完全忘了。