2015-10-14 33 views
0

我需要清理表中可能被头部污染的字符串。不需要的字符将以多个字符显示,而有效字符之间可能会出现一些常见字符,而有效字符串以[0-9a-zA-Z],\[\]和下划线开头,但可能包含其他字符,如#@ This_is_.a_[cat]^,' __process_'data'#。如何识别我的有效字符串的开始位置?如何识别可能是字母或下划线的字符位置

WHILE LEN(@str) > 1 IF PATINDEX([0-9a-zA-Z\[\]_]%, @str) = 0 @str = SUBSTRING(@str,2,999) ELSE --find valid head

或类似PATINDEX([0-9a-zA-Z\[\]_]% ESCAPE _, @str)的方式,

PATINDEX([0-9a-zA-Z\[\]_]% ESCAPE [_], @str)

PATINDEX([0-9a-zA-Z\[\][_]]%, @str)

不起作用(PATINDEX总是= 0)。

+0

你可以添加一些例子:输入字符串和清洗后的预期值? –

+0

@Julien Vavasseur例如'__process_'data'#'作为'__process_'data'#','。 $$ @@#123_456'应该变成'123_456' – a4194304

回答

0

我不知道函数PATINDEX,但如果你检查每个字符CHARINDEX,直到你找到一个允许在字符串开头的字符,它应该工作。试试这个例子:

DECLARE @Str nvarchar(50) = N'"§$"!This is your text or column or whatever'; 
DECLARE @AllowStart nvarchar(100) = N'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ[]_'; -- All characters which are allowed at the beginning 
DECLARE @Index int = 1; 
WHILE @Index <= LEN(@Str) 
BEGIN 
    IF CHARINDEX(SUBSTRING(@Str, @Index, 1), @AllowStart) > 0 -- Test if character at position @Index is part of @AllowStart 
     BREAK; 

    SET @Index += 1; 
END 

SET @Str = SUBSTRING(@Str, @Index, 100); 
+0

那么,使用'CHARINDEX'通过'反向'解决这个问题非常棒! – a4194304

+0

你不需要@ EndLoop。它可以被Break取代。 SET @ Str = SUBSTRING可以在循环之外完成。 –

+0

这是一个好主意。我编辑了我的答案。 – Dorian

相关问题