13

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

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

我需要从第二次出现_直到字符串结尾获取子字符串,正如您所看到的,子字符串的长度不是固定的。第一部分并不总是固定的,它可以改变。截至目前,我正在使用以下代码来实现它。

SELECT SUBSTRING([String],CHARINDEX('_',[String],(CHARINDEX('_',[String])+1))+1,100)
FROM [Table]

如您所见,我将任意大值作为长度来处理可变长度。有更好的方法吗?

4

6 回答 6

14

您可以CHARINDEX与函数结合使用REVERSE来查找最后一次出现的_,并且可以使用RIGHT从字符串末尾获取指定数量的字符。

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

SQLFiddle 演示

于 2013-07-31T16:07:47.180 回答
8

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

 SELECT SUBSTRING([String],CHARINDEX('_',[String],(CHARINDEX('_',[String])+1))+1,len([string])) FROM [Table]
于 2013-07-31T16:00:01.577 回答
3

您可以使用公用表表达式来完成如下代码所示的工作。无论字符串中有多少下划线,这都为获取所有子字符串提供了额外的灵活性。

;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
于 2013-07-31T16:18:53.843 回答
1

这对我来说似乎很好:

declare @yourvariable nvarchar(max)

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

select substring(@yourvariable,2,len(@yourvariable))
于 2021-04-01T09:49:42.380 回答
0

或者,即使这样:

SELECT SUBSTRING([String],CHARINDEX('_',[String],(CHARINDEX('_',[String])+1))+1,
             LEN([String])-CHARINDEX('_',[String])+1)
于 2013-07-31T16:02:16.987 回答
0

这看起来也更整洁和简洁:

Select substring(yourtemp.yourcolumn,2,len(yourtemp.yourcolumn)) as yourcolumn
from(
select(
SELECT  distinct ','+yourcolumn
from yourtable
for xml path('') ) as yourcolumn) as yourtemp
于 2021-04-01T15:08:41.617 回答