Oracle-Regexp_Like

时间:2019-07-08 10:16:09

标签: sql regex oracle oracle11g

Oracle:有一个“ CUSTOMER”表和“ EXCEPTION_KEYWORDS”表。 我想从Exception_keywords表中选择名称包含任何关键字的客户。

我尝试在Regexp_Like内部使用子查询,但出现错误:

  

ORA-01427:单行子查询返回多个行   01427. 00000-“单行子查询返回多个行”

我的查询:

SELECT * FROM CUSTOMER 
WHERE REGEXP_LIKE (STD_NAME,(Select KEYWORD from EXCEPTION_KEYWORDS),'i');

注意:我只需要使用Regexp解决方案。

4 个答案:

答案 0 :(得分:1)

也许使用LIKElower()的存在查询

SELECT * FROM CUSTOMER  c 
    WHERE  EXISTS ( SELECT 1 FROM 
         EXCEPTION_KEYWORDS e 
 WHERE lower(c.STD_NAME) like '%'||lower(e.KEYWORD)||'%' );

答案 1 :(得分:1)

检查存在性

SELECT * 
FROM CUSTOMER 
WHERE EXISTS (select null from EXCEPTION_KEYWORDS where REGEXP_LIKE (STD_NAME,KEYWORD ,'i'));

答案 2 :(得分:1)

另一种方法是将regexp_like()listagg()函数一起使用:

SELECT * 
  FROM CUSTOMER 
 WHERE REGEXP_LIKE (STD_NAME,
 (SELECT LISTAGG(KEYWORD,'|') WITHIN GROUP (ORDER BY KEYWORD) list 
    FROM EXCEPTION_KEYWORDS),'i');

答案 3 :(得分:0)

您可以直接JOIN这些表并在regexp_like()子句中使用ON

SELECT * 
  FROM CUSTOMER 
  JOIN EXCEPTION_KEYWORDS 
    ON REGEXP_LIKE (STD_NAME,KEYWORD,'i');

Demo