从字符串中的两个字符之间选择文本

时间:2018-02-02 14:54:55

标签: sql sql-server tsql charindex

我在数据库中有数据,下面有数据示例

folder/subfolder/file/doc
folder/subfolder/doc

如何从'/'

之间获取第一个字符实例

我想提取'folder/subfolder'

我尝试了以下但不是我需要的。这得到'文件夹/'

LEFT([Cat], CHARINDEX('/', [Cat]) ) as 'doc_cat',

以下是最后一部分

RIGHT([Cat], CHARINDEX('/', [Cat]) ) as 'doc_cat2',

我想获得字符串

的第一部分和第二部分

4 个答案:

答案 0 :(得分:0)

这是一种方法:

select left(doc_cat_1, charindex('/', doc_cat_1) - 1)
from t cross apply
     (select stuff(cat, 1, charindex('/', cat), '') as doc_cat_1
     ) v1;

SQL Server的字符串处理功能非常糟糕。 Apply至少可以更轻松地处理中间结果。

答案 1 :(得分:0)

您可以使用LEFTCHARINDEX

LEFT([Cat],charindex('/',[Cat],charindex('/',[Cat])+1)-1) AS 'doc_cat'

答案 2 :(得分:0)

使用XML -

完成的另一种方法
declare @s table(patterns nvarchar(100))
insert into @s 
values ('folder/subfolder/file/doc'), ('folder/subfolder/doc'),('folder/subfolder')
select cast(concat('<x>', REPLACE(patterns, '/', '</x><x>'), '</x>') as xml).value('/x[1]','varchar(100)') + '/' 
     + cast(concat('<x>', REPLACE(patterns, '/', '</x><x>'), '</x>') as xml).value('/x[2]','varchar(100)') 
from @s

答案 3 :(得分:0)

如果您使用的是SQL 2016或更新版本,则可以使用STRING_SPLIT()

WITH cte AS (
SELECT cat, value, ROW_NUMBER() OVER (PARTITION BY cat ORDER BY cat) rn
FROM someTable CROSS APPLY
     STRING_SPLIT(cat,'/')
)
SELECT cat, value FROM cte WHERE rn = 2;

这里的优点是rn可以是你需要的任何数字。

Fiddle此处。