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)
更新
如果您的字符串中有未知数量的反斜杠,您可以这样做:
DECLARE @string VARCHAR(255) = '\\abcde\fghijl\akjfljadf\'
SELECT left(ltrim(replace(@string, '\', ' ')),
charindex(' ',ltrim(replace(@string, '\', ' ')))-1) AS new_string
我的字符串看起来像这样:
\\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)
更新
如果您的字符串中有未知数量的反斜杠,您可以这样做:
DECLARE @string VARCHAR(255) = '\\abcde\fghijl\akjfljadf\'
SELECT left(ltrim(replace(@string, '\', ' ')),
charindex(' ',ltrim(replace(@string, '\', ' ')))-1) AS new_string