Sql 选择包含非字母数字的行

Sql 选择包含非字母数字的行,sql,sql-server,Sql,Sql Server,我需要选择名称中包含非字母数字值的行。我得到了部分解决方案,但是,我也得到了带有空格、连字符和单引号的行。所以,我需要用字母数字的方式来拉行,而不是用空格和-and'来拉行 在网上做了一些调查 select * from EMP where NAME like '%[^a-z,1-9]%' 我不想得到带有-或空格或“的行,我认为应该是这样的: select * from EMP where (NAME NOT LIKE '%-%' OR NOT LIKE '%[ ]%' OR NO

我需要选择名称中包含非字母数字值的行。我得到了部分解决方案,但是,我也得到了带有空格、连字符和单引号的行。所以,我需要用字母数字的方式来拉行,而不是用空格和-and'来拉行

在网上做了一些调查

select * 
from EMP  
where NAME like '%[^a-z,1-9]%'

我不想得到带有-或空格或“

的行,我认为应该是这样的:

select * 
from EMP  
where (NAME NOT LIKE '%-%' OR NOT LIKE '%[ ]%' OR NOT LIKE '%\'%' ESCAPE '\');
“%[]%”->提供一个或多个空格

转义->特殊角色需要转义

您还可以向正则表达式中添加'、-和空格字符

select * 
from EMP  
where NAME like '%[^a-z,1-9''- ]%'

下面是一种使用数字表查找坏字符的方法:

create table #GoodLetters(letter char(1))

insert into #GoodLetters
values
 ('a'),('b'),('c'),('d'),('e'),('f'),('g'),('h'),('i'),('j'),('k'),('l'),('m'),('n'),('o'),('p'),('q'),('r'),('s'),('t'),('u'),('v'),('w'),('x'),('y'),('z')
,('0'),('1'),('2'),('3'),('4'),('5'),('6'),('7'),('8'),('9')
,('-'),(' '),('''')

--select * from #GoodLetters

select a._key, a.name,substring(a.name, v.number+1, 1) 
from (select 'Your Key' _key,name from emp ) a
    join master..spt_values v on v.number < len(a.name)
    left join #GoodLetters GL on substring(a.name, v.number+1, 1)=GL.letter
where v.type = 'P'
    and GL.letter is null

drop table #GoodLetters

连字符有点棘手。因为它用于字符类,所以它必须是类中的第一个字符。因此:

where name like '%[^- a-z,1-9]%'

在标准SQL中,LIKE支持的唯一通配符是%表示任意数量的字符,而u表示单个字符。您似乎假设LIKE在SQL中支持某种正则表达式语法——事实并非如此。至少不在标记SQL引用的标准SQL中to@a_horse_with_no_name很确定topicstarter在这里指的是SQL Server MSSQL。因为SQL Server在操作符中支持一些非常有限的正则表达式支持。@RaymondNijland:我们不知道。也许OP只是找到了一些答案,声称SQL将支持这一点,现在她/他很惊讶,这不适用于遵守SQL标准的DBMS。我们不知道我们知道或者至少相当确定@a_horse_,没有名字注意到topicstarter说的话,但是,我也得到了带有空格的行,连字符和单引号,因此他使用的是一个尊重这种SQL方言的DBMS。。或者他正在使用sybase,这也是可能的。@MJoy我确实同意没有名字的马顺便说一句,topicstarter应该提供更多信息,或者使用正确的标记。。更不用说提供示例数据和预期结果了。