SQL:如何select特殊字符之间的子串

SQL: how to select a substring between special characters

我的字符串看起来像这样:

\\abcde\fghijl\akjfljadf\
\xyz3

我想要 select 第一组和下一组斜杠之间的所有内容

想要的结果:

abcde
xyz

已编辑:为了澄清,特殊字符始终是斜杠 - 但前导字符不是固定的,有时有 3 个斜杠,有时只有 2 个斜杠,然后是文本,然后是 1 个或多个斜杠、更多文本、1 个或多个斜杠,依此类推。我根本没有使用任何适配器,只是在我的 SQL 查询

中寻找 select 这个子字符串的方法

请指教

提前致谢。

像这样使用子字符串(仅适用于两个斜线、字符、然后另一个斜线的指定模式):

declare @str varchar(100) = '\abcde\cc\xxx'

select substring(@str, 3, charindex('\', @str, 3) - 3)

当然,将 @str 替换为您实际要搜索的列。

charindex returns 第一个斜杠的位置,从第 3 个字符开始(即跳过前两个斜杠)。然后是 substring returns 字符串的一部分,从第 3 个字符开始(再次跳过前两个斜杠),一直持续到下一个斜杠之前,由 charindex 确定。

编辑:要使其在开头使用不同数量的斜杠,请使用 patindex 和正则表达式来查找第一个字母数字字符,而不是硬编码它应该是第三个字符。示例:

declare @str varchar(100) = '\Abcde\cc\xxx'

select substring(@str, patindex('%[a-zA-Z0-9]%', @str), charindex('\', @str, patindex('%[a-zA-Z0-9]%', @str)) - patindex('%[a-zA-Z0-9]%', @str))

如果您的字符串始终遵循所描述的模式,APH 的解决方案效果会更好。然而,尽管有模式,这将获得文本。

declare @str varchar(100) = '\abcde\fghijl\akjfljadf\'
declare @srch char(1) = '\'
select 
SUBSTRING(@str,
    (CHARINDEX(@srch,@str,(CHARINDEX(@srch,@str,1)+1))+1),
    CHARINDEX(@srch,@str,(CHARINDEX(@srch,@str,(CHARINDEX(@srch,@str,1)+1))+1))
         - (CHARINDEX(@srch,@str,(CHARINDEX(@srch,@str,1)+1))+1)
)

抱歉格式化。

已编辑以更正用户粘贴错误。 :)

您可以执行 cross join 来找到反斜杠的第二个位置。然后,使用 substring 函数获取文本的第 2 个和第 3 个反斜杠之间的字符串,如下所示:

SELECT substring(string, 3, (P2.Pos - 2)) AS new_string
FROM strings
CROSS APPLY (
    SELECT (charindex('\', replace(string, '\', '\')))
    ) AS P1(Pos)
CROSS APPLY (
    SELECT (charindex('\', replace(string, '\', '\'), P1.Pos + 1))
    ) AS P2(Pos)

SQL Fiddle Demo

更新

如果您的字符串中有未知数量的反斜杠,您可以这样做:

DECLARE @string VARCHAR(255) = '\\abcde\fghijl\akjfljadf\'

SELECT left(ltrim(replace(@string, '\', ' ')), 
       charindex(' ',ltrim(replace(@string, '\', ' ')))-1) AS new_string

SQL Fiddle Demo2