SQL Server:如何从字符串中删除前导/尾随的非字母数字字符?

SQL Server:如何从字符串中删除前导/尾随的非字母数字字符?,sql,sql-server,regex,Sql,Sql Server,Regex,我正在使用SQLServer2008,并尝试清理URL列表 一些现有的文本示例: www.google.com 'www.google.com' /www.google.com www.google.com/ 理想情况下,我可以去掉任何前导/尾随的非字母数字字符,这样这四个字符的输出将与 www.google.com 为什么不直接使用replace() SELECT REPLACE(REPLACE(col, '''', ''), '/', '') 如果你知道它们只是开始和结束,你可以: w

我正在使用SQLServer2008,并尝试清理URL列表

一些现有的文本示例:

www.google.com
'www.google.com'
/www.google.com
www.google.com/
理想情况下,我可以去掉任何前导/尾随的非字母数字字符,这样这四个字符的输出将与

www.google.com

为什么不直接使用
replace()

SELECT REPLACE(REPLACE(col, '''', ''), '/', '')

如果你知道它们只是开始和结束,你可以:

with t as (
      select *
      from (values ('www.google.com'), ('''www.google.com'''), ('/www.google.com')) v(text)
     )
select t.text, v2.text2
from t cross apply
     (values (stuff(t.text, 1, patindex('%[a-zA-Z0-9]%', t.text) - 1, ''))
     ) v(text1) cross apply
     (values (case when v.text1 like '%[^a-zA-Z0-9]'
                   then stuff(v.text1, len(text) + 1 - patindex('%[a-zA-Z0-9]%', reverse(v.text1)), len(v.text1), '')
                   else v.text1
              end)
     ) v2(text2);

是一个dbfiddle。

您应该能够使用子字符串。计算长度可能很棘手:

DECLARE @temp TABLE (val varchar(100))
INSERT INTO @temp VALUES
 ('www.google.com'),('''www.google.com'''),('/www.google.com'),('www.google.com/'),('[www.google.com];')

SELECT SUBSTRING(val
                ,PATINDEX('%[a-zA-Z0-9]%', val) --start at position
                ,LEN(val) + 2 - PATINDEX('%[a-zA-Z0-9]%', val) 
                  - PATINDEX('%[a-zA-Z0-9]%', REVERSE(val)) --length of substring
                ) AS [Result]
  FROM @temp
产生输出:

Result
--------------
www.google.com
www.google.com
www.google.com
www.google.com
www.google.com

可能的重复?是否只有一个非字母数字值,或者可能有多个?您需要考虑所有非字母数字值,不是吗?我认为patindex上缺少一个括号(在最后一行的旁边)@西蒙。在测试之前,我总是在SQL Server中出错。答案现在起作用了。我给你紫外线,因为这可能满足他们的需要。它在某些情况下不起作用,分号,冒号,大括号,奇怪的东西。@scsimon。这将删除代码中字符类中未提及的任何字符。因此,它会删除前导分号或尾随分号、冒号、尾随大括号以及其他非a-z、a-z或0-9的内容。