繁体   English   中英

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

[英]SQL: how to select a substring between special characters

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

\\\abcde\fghijl\akjfljadf\\
\\xyz\123

我想选择第一组和下一组斜线之间的所有内容

所需结果:

abcde
xyz

编辑:为了明确起见,特殊字符始终是斜杠-但前导字符不是恒定的,有时会有3个斜杠,有时只有2个斜杠,然后是文本,然后是1个或多个斜杠,还有更多文本,1个或多个斜杠,依此类推。 我根本没有使用任何适配器,只是在我的SQL查询中寻找一种选择此子字符串的方法

请指教。

提前致谢。

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

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小提琴演示

UPDATE

以防万一,当字符串中的反斜杠数量未知时,您可以执行以下操作:

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

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

SQL小提琴Demo2

像这样使用子字符串(仅适用于两个斜杠,字符和另一个斜杠的指定模式):

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

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

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

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

编辑:要使开头的斜杠数量不同,请使用patindex和regex查找第一个字母数字字符,而不是硬编码它应为第三个字符。 例:

declare @str varchar(100) = '\\\1Abcde\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)
)

抱歉,格式化。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM