[英]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)
UPDATE
以防万一,当字符串中的反斜杠数量未知时,您可以执行以下操作:
DECLARE @string VARCHAR(255) = '\\\abcde\fghijl\akjfljadf\\'
SELECT left(ltrim(replace(@string, '\', ' ')),
charindex(' ',ltrim(replace(@string, '\', ' ')))-1) AS new_string
像这样使用子字符串(仅适用于两个斜杠,字符和另一个斜杠的指定模式):
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.