SQL字符串与Like

时间:2018-07-05 14:33:18

标签: sql sql-server-2008

我正在尝试使用类似模式来验证字符串,该模式仅由以下字符组成,并且我与之接近,但仍然可以绕过我的curernt表达式:

valid characters: numbers 0-9, alphanumeric chars + . = \ 

表达式:

'%[^[0-9A-Za-z+.\_\-\=\\\]]%' ESCAPE '\' 

但是使用该表达式,带方括号和“-”字符的字符串也被视为正确。如果像这样将内括号换成普通括号

'%[^(0-9A-Za-z+.\_\-\=\\\)]%' ESCAPE '\' 

我仍然有相同的问题,但是这次使用了中括号。 测试数据:

IF OBJECT_ID('TEMPDB..#temp') IS NOT NULL DROP TABLE #temp
CREATE TABLE #temp(
    string varchar(max),
    expectedResult varchar(max),
    result varchar(max)
)
insert #temp(string,expectedResult)
values
('da)ssdas', 'invalid'),
('DFGHJ§$%', 'invalid'),
('+=8rt8\\//12=+', 'invalid'),
('[BIGBEAR]', 'invalid'),
('BIG-BEAR', 'invalid'),
('x[BIGBEAR]x', 'invalid'),
('(BIGBEAR)', 'invalid'),
('+=8rt8Ahd12=+', 'valid')

update #temp
set result =    CASE WHEN string like '%[^[0-9A-Za-z+.\_\-\=\\\]]%' ESCAPE '\' 
                        THEN 'invalid'
                ELSE'valid'
                END

select * from #temp

结果

string         expectedResult   result
da)ssdas       invalid          invalid
DFGHJ§$%        invalid          invalid
+=8rt8\\//12=+ invalid          invalid
[BIGBEAR]      invalid          valid
BIG-BEAR       invalid          valid
x[BIGBEAR]x    invalid          valid
(BIGBEAR)      invalid          invalid
+=8rt8Ahd12=+  valid            valid

1 个答案:

答案 0 :(得分:0)

我想你只是想要

'%[^0-9A-Za-z+.\_\-\=\\]%' ESCAPE '\' 

字符类中的^适用于所有字符。为了可读性,我将使用其他转义字符。连字符作为字符类中的第一个字符表示连字符,因此唯一需要转义的字符是反斜杠:

'%[^-0-9A-Za-z+=$\]%' ESCAPE '$'