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

时间:2015-07-22 18:45:22

标签: sql string sql-server-2014

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

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

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

期望的结果:

abcde
xyz

编辑:为了澄清,特殊字符总是斜线 - 但是前导字符不是常量,有时有3个斜杠,其他时间只有2个斜杠,后跟文本,然后是1个或多个斜杠,一些更多的文本,一个或多个斜杠,依此类推。我根本没有使用任何适配器,只是想在SQL查询中选择这个子串的方法

请告知。

提前致谢。

3 个答案:

答案 0 :(得分:2)

您可以执行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

答案 1 :(得分:1)

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

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

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

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

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

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

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))

答案 2 :(得分:0)

如果你的字符串总是遵循描述的模式,APH的解决方案会更好。然而,尽管有这种模式,这将得到文本。

<option value="' . $country. '">' . $country . '</option>';

抱歉格式化。

已修改以更正用户粘贴错误。 :)