如何在oraclesql中找到col包含字母、数字或特殊字符(连字符、撇号和空格除外)的行

jdg4fx2g  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(537)

我必须找到这样的名字:robert@jr23 (必须有字母表、除连字符(-)、撇号(')和空格以外的任何特殊字符或数字)。
我是这样做的:

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

但我没有得到正确的结果。
需要匹配:

  1. Kevin#123
  2. bob@jr
  3. mike$dr

需要排除:

  1. Alex-jr
  2. Robert'jr
  3. Brian jr
zpf6vheq

zpf6vheq1#

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

  1. select column_value
  2. from ora_mining_varchar2_nt
  3. ( 'Kevin#123'
  4. , 'bob@jr'
  5. , 'mike$dr'
  6. , 'Alex-jr'
  7. , 'Robert''jr'
  8. , 'Brian jr'
  9. , 'A!' )
  10. where 1=1
  11. and not regexp_like(column_value,'[- '']')
  12. and regexp_like
  13. (column_value, '([A-Z0-9]+[^A-Z0-9])|([^A-Z0-9]+[A-Z0-9])', 'i') ;

编辑:添加了 regex_like 条件,以确保值包含字母或数字和“特殊字符”,这里指的是既不是字母、数字也不是空格的字符, ' 或者 - .

lnlaulya

lnlaulya2#

您可以使用以下查询来包括除 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>

展开查看全部
bfhwhh0e

bfhwhh0e3#

一种选择是用 NULL ,剩下的无效:

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

我不知道你想得到什么结果。下面是一些例子,展示了这样一个正则表达式的结果;因此,您希望获得哪些ID?

  1. SQL> with test (id, col) as
  2. 2 (select 1, 'Robert@jr23' from dual union all
  3. 3 select 2, 'Kevin#123' from dual union all
  4. 4 select 3, 'bob@jr' from dual union all
  5. 5 select 4, 'mike$dr' from dual union all
  6. 6 select 5, 'Alex-jr' from dual union all
  7. 7 select 6, 'Robert''jr' from dual union all
  8. 8 select 7, 'Brian jr' from dual union all
  9. 9 select 8, 'Brian10' from dual
  10. 10 )
  11. 11 select col,
  12. 12 regexp_replace(col,
  13. 13 '[[:alpha:]]|[[:digit:]]|[[:space:]]|-|''', null) result
  14. 14 from test;
  15. COL RESULT
  16. ----------- ----------
  17. Robert@jr23 @
  18. Kevin#123 #
  19. bob@jr @
  20. mike$dr $
  21. Alex-jr
  22. Robert'jr
  23. Brian jr
  24. Brian10
  25. 8 rows selected.
  26. SQL>

你的一条评论说:
选择必须有特殊字符或数字的客户名称(空格、连字符和撇号除外)
这意味着数字和特殊字符应该被视为“相等”。如果是这样,这有帮助吗?

  1. SQL> with test (id, col) as
  2. 2 (select 1, 'Robert@jr23' from dual union all
  3. 3 select 2, 'Kevin#123' from dual union all
  4. 4 select 3, 'bob@jr' from dual union all
  5. 5 select 4, 'mike$dr' from dual union all
  6. 6 select 5, 'Alex-jr' from dual union all
  7. 7 select 6, 'Robert''jr' from dual union all
  8. 8 select 7, 'Brian jr' from dual union all
  9. 9 select 8, 'Brian10' from dual
  10. 10 )
  11. 11 select id, col
  12. 12 from test
  13. 13 where regexp_replace(col, '[[:alpha:]]|[[:space:]]|-|''', '')
  14. 14 is not null;
  15. ID COL
  16. ---------- -----------
  17. 1 Robert@jr23
  18. 2 Kevin#123
  19. 3 bob@jr
  20. 4 mike$dr
  21. 8 Brian10
  22. SQL>
展开查看全部

相关问题