我在数据库中有数据,下面有数据示例
folder/subfolder/file/doc
folder/subfolder/doc
如何从'/'
之间获取第一个字符实例我想提取'folder/subfolder'
我尝试了以下但不是我需要的。这得到'文件夹/'
LEFT([Cat], CHARINDEX('/', [Cat]) ) as 'doc_cat',
以下是最后一部分
RIGHT([Cat], CHARINDEX('/', [Cat]) ) as 'doc_cat2',
我想获得字符串
的第一部分和第二部分答案 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)
您可以使用LEFT
和CHARINDEX
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此处。