【问题标题】:How to find a row where col have alphabets,numbers or special characters (except hyphen,apostrophe and space) in Oracle SQL如何在 Oracle SQL 中查找 col 包含字母、数字或特殊字符(连字符、撇号和空格除外)的行
【发布时间】:2020-07-17 12:41:12
【问题描述】:

我必须找到像这样的名字:Robert@jr23(必须有字母,任何特殊字符或数字,除了连字符(-),撇号(')和空格)。

我的做法如下:

select * from test where REGEXP_LIKE(trim(NAME_1), '[^- '']')

但是我没有得到正确的结果。

需要匹配:

Kevin#123
bob@jr
mike$dr

需要排除:

Alex-jr
Robert'jr
Brian jr

【问题讨论】:

  • 请提供更多匹配和不匹配的名称示例。 NAME_1 是什么?
  • @GordonLinoff Name_1 是列名,我编辑了问题。
  • 我认为你需要not regex_like。否则,您将匹配包含有效字符的字符串,即所有字符。

标签: sql regex oracle regexp-like


【解决方案1】:

您需要将not 与要排除的值匹配的模式一起使用。否则,您将匹配包含不在排除列表中的任何字符的字符串,即所有字符。

select column_value
from   ora_mining_varchar2_nt
       ( 'Kevin#123'
       , 'bob@jr'
       , 'mike$dr'
       , 'Alex-jr'
       , 'Robert''jr'
       , 'Brian jr'
       , 'A!' )
where  1=1
and    not regexp_like(column_value,'[- '']')
and    regexp_like
       (column_value, '([A-Z0-9]+[^A-Z0-9])|([^A-Z0-9]+[A-Z0-9])', 'i') ;

编辑:添加了regex_like 条件以确保值包含字母或数字和“特殊字符”,这意味着此处的字符既不是字母、数字也不是空格,' 或 -。

【讨论】:

  • 这行得通,但我只得到不存在空格、撇号和连字符的记录,但我如何得到有其他特殊字符的地方。
  • 还有什么特殊字符?这与您提供的所有示例相匹配。是不是还必须包含一些特殊字符的规则?
  • 是 名称必须包含一些特殊字符,除了空格、连字符和撇号。
  • 您可以使用这些字符添加另一个 regex_like 子句。如果您通过示例指定您的要求,我可以添加它。
  • 如果没有定义特定的特殊字符怎么办。基本上我需要选择一个必须有特殊字符或数字的客户名称(空格、连字符和撇号除外)
【解决方案2】:

您可以使用以下查询来包含除space, - and ' 之外的所有特殊字符

SQL> with tbl(name) as (
  2        select 'Kevin#123'          from dual union
  3        select 'bob@jr' from dual union
  4        select 'mike$dr' from dual union
  5        select 'Alex-jr'         from dual union
  6    select 'Brian jr'         from dual union
  7    select 'Brian)jr'         from dual union
  8        select 'Robert''jr'  from dual
  9      )
 10      select *
 11      from tbl
 12      where regexp_like(name, '[^[a-z]|[A-Z]|[:space:]|[:cntrl:]|/]')
 13  and  not regexp_like(name,'[- '']');

NAME
---------
Brian)jr -- see this is included
Kevin#123
bob@jr
mike$dr

SQL>

【讨论】:

  • 如果我在我的代码中使用你的第一个 where 子句,它给我的名字只有字母,但我总是想要带有特殊字符的字母。
  • 第一个 where 子句在做什么?你能解释一下吗?
  • 我不应该从下面的代码中得到 'Robert': WITH tbl(name) AS ( SELECT 'Kevin#123' FROM dual UNION SELECT 'bob@jr' FROM dual UNION SELECT 'mike$dr ' FROM dual UNION SELECT 'Alex-jr' FROM dual UNION SELECT 'Brian jr' FROM dual UNION SELECT 'Brian)jr' FROM dual UNION SELECT 'Robert''jr' FROM dual UNION SELECT 'Robert2jr' FROM dual UNION SELECT 'Robert ' FROM dual ) SELECT * FROM tbl WHERE regexp_like(name, '[^[a-z]|[A-Z]|[:space:]|[:cntrl:]|/]') 而不是 regexp_like(name,'[- ' ']');
【解决方案3】:

一种选择是用NULL 替换所有有效的东西,剩下的就是无效:

SQL> with test (col) as
  2    (select 'Robert@jr23' from dual union all
  3     select 'Kevin#123'   from dual union all
  4     select 'bob@jr'      from dual union all
  5     select 'mike$dr'     from dual union all
  6     select 'Alex-jr'     from dual union all
  7     select 'Robert''jr'  from dual union all
  8     select 'Brian jr'    from dual
  9    )
 10  select col
 11  From test
 12  where regexp_replace(col, '[[:alpha:]]|[[:digit:]]|-|''', null) is not null;

COL
-----------
Robert@jr23
Kevin#123
bob@jr
mike$dr
Brian jr

SQL>

我对您实际上想要得到的结果感到困惑。以下是一些显示此类正则表达式结果的示例;作为结果,您希望获得哪些 ID?

SQL> with test (id, col) as
  2    (select 1, 'Robert@jr23' from dual union all
  3     select 2, 'Kevin#123'   from dual union all
  4     select 3, 'bob@jr'      from dual union all
  5     select 4, 'mike$dr'     from dual union all
  6     select 5, 'Alex-jr'     from dual union all
  7     select 6, 'Robert''jr'  from dual union all
  8     select 7, 'Brian jr'    from dual union all
  9     select 8, 'Brian10'     from dual
 10    )
 11  select col,
 12  regexp_replace(col,
 13    '[[:alpha:]]|[[:digit:]]|[[:space:]]|-|''', null) result
 14  from test;

COL         RESULT
----------- ----------
Robert@jr23 @
Kevin#123   #
bob@jr      @
mike$dr     $
Alex-jr
Robert'jr
Brian jr
Brian10

8 rows selected.

SQL>

你的一个 cmets 说:

选择必须包含特殊字符或数字的客户名称(空格、连字符和撇号除外)

这意味着数字和特殊字符应该被视为“相等”。如果是这样,这有帮助吗?

SQL> with test (id, col) as
  2    (select 1, 'Robert@jr23' from dual union all
  3     select 2, 'Kevin#123'   from dual union all
  4     select 3, 'bob@jr'      from dual union all
  5     select 4, 'mike$dr'     from dual union all
  6     select 5, 'Alex-jr'     from dual union all
  7     select 6, 'Robert''jr'  from dual union all
  8     select 7, 'Brian jr'    from dual union all
  9     select 8, 'Brian10'     from dual
 10    )
 11  select id, col
 12  from test
 13  where regexp_replace(col, '[[:alpha:]]|[[:space:]]|-|''', '')
 14    is not null;

        ID COL
---------- -----------
         1 Robert@jr23
         2 Kevin#123
         3 bob@jr
         4 mike$dr
         8 Brian10

SQL>

【讨论】:

  • 它不适合我。我需要选择一个必须包含字母和特殊字符或数字的名称(连字符、空格和撇号除外)
  • 你的意思是,与查询返回的相反?试试where NOT regexp_replace ...
  • 你能解释一下“regexp_replace(col, '[[:alpha:]]|[[:digit:]]|-|''', null) is not null”是如何工作的吗?
  • 它将字母或数字或连字符或撇号替换为空字符串,这意味着 - 如果 COL 没有提到 characters 之外的任何内容 - 那些“除了”字符是结果.因此,如果这样的字符串不是 NULL,则意味着 COL 确实包含 字母/数字/连字符/撇号。
  • 好的,但是你的语句是获取空间并忽略数字,假设我有'Brian10',我应该选择这个,如果我有'Brian Jr',我不应该选择它。
猜你喜欢
  • 1970-01-01
  • 2020-01-15
  • 2015-01-24
  • 1970-01-01
  • 2012-02-06
  • 2013-01-16
  • 2014-10-27
  • 1970-01-01
  • 2011-10-13
相关资源
最近更新 更多