我有一个包含列的表,其中包含如下所示的字符串。
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]
正如您所看到的,我将任意大的值作为处理可变长度的长度。有没有更好的方法呢?
答案 0 :(得分:13)
您可以将CHARINDEX
与REVERSE
功能结合使用,以查找_
的最后一次出现,您可以使用RIGHT
从最后获得指定数量的字符字符串。
SELECT RIGHT([String],CHARINDEX('_',REVERSE([String]),0)-1)
<强> SQLFiddle DEMO 强>
答案 1 :(得分:7)
您可以尝试将len([string])作为最后一个参数:
SELECT SUBSTRING([String],CHARINDEX('_',[String],(CHARINDEX('_',[String])+1))+1,len([string])) FROM [Table]
答案 2 :(得分:2)
您可以使用公用表表达式来完成下面的代码。无论字符串中有多少个下划线,都可以更灵活地获取所有子字符串。
;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
答案 3 :(得分:0)
或者,即便如此:
SELECT SUBSTRING([String],CHARINDEX('_',[String],(CHARINDEX('_',[String])+1))+1,
LEN([String])-CHARINDEX('_',[String])+1)
答案 4 :(得分:0)
这对我来说似乎不错:
declare @yourvariable nvarchar(max)
set @yourvariable=(Select
(SELECT distinct ','+yourcolumn
from yourtable
for xml path('')) )
select substring(@yourvariable,2,len(@yourvariable))
答案 5 :(得分: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