【问题标题】:select rows that contain non alphanumeric选择包含非字母数字的行
【发布时间】:2019-11-12 03:52:42
【问题描述】:

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

在网上做了一些研究

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

我不想得到带有- 或空格或' 的行

【问题讨论】:

  • 在(标准)SQL 中,LIKE 支持的唯一通配符是% 用于“任意数量的字符”和_ 用于“单个字符”。您似乎假设 LIKE 支持 SQL 中的某种正则表达式语法 - 事实并非如此。至少不在标准 SQL 中(sql 所指的标签)
  • @a_horse_with_no_name 很确定 topicstarter 在这里是指 SQL Server (MSSQL)。由于 SQL Server 在 LIKE 运算符中支持一些非常有限的正则表达式。
  • @RaymondNijland:我们不知道。也许 OP 只是找到了一些声称“SQL”会支持它的答案,现在她/他很惊讶这不适用于尊重 SQL 标准的 DBMS。
  • “我们不知道”我们“知道”或至少很确定 @a_horse_with_no_name 注意到 topicstarter 所说的“但是,我也得到带有空格、连字符和单引号的行”,所以他是使用尊重这种 SQL 方言的 DBMS .. 或者他正在使用 sybase,这也是可能的。
  • @MJoy 顺便说一句,我确实同意 a_horse_with_no_name,topicstarter 应该提供更多信息或使用正确的标记。更不用说提供示例数据和预期结果了。

标签: sql sql-server


【解决方案1】:

我认为应该是这样的:

select * 
from EMP  
where (NAME NOT LIKE '%-%' OR NOT LIKE '%[ ]%' OR NOT LIKE '%\'%' ESCAPE '\');
  • '%[ ]%' -->给你一个或多个空格

  • ESCAPE --> 需要特殊字符

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      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
      

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2016-01-02
          • 1970-01-01
          • 2013-08-30
          • 1970-01-01
          • 2016-10-29
          • 1970-01-01
          • 2011-11-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多