【问题标题】:Oracle - Sub query within Regexp_LikeOracle - Regexp_Like 中的子查询
【发布时间】:2019-11-17 20:14:38
【问题描述】:

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');

注意:我只需要使用正则表达式的解决方案。

【问题讨论】:

    标签: sql regex oracle oracle11g


    【解决方案1】:

    可能存在使用LIKElower() 的查询

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

    【讨论】:

    • 嗨,我已经以同样的方式解决了,但我想知道 Oracle 是否允许在 Regexp_like 内进行子查询。如果是,语法是什么?
    • @RamananB :您的问题的答案是肯定的,Oracle 允许在 Regexp_like 中使用子查询。但它在你的情况下返回多行,因此不可能这样写。
    【解决方案2】:

    检查存在

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 嗨,它没有工作。尽管使用了 Listagg,但仍出现“值过多”之类的错误。可能是输出应该用大括号和单引号连接以满足语法中的 Regexp 参数 2。无论如何,这不是解决问题的理想方法。感谢您的宝贵时间。
      • 它工作正常,我又试了一次。它在 11g 中运行不佳,但在 12c 中运行正常
      【解决方案4】:

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

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

      Demo

      【讨论】:

      • 非常感谢您的解决方案和演示。
      猜你喜欢
      • 1970-01-01
      • 2018-03-22
      • 1970-01-01
      • 1970-01-01
      • 2017-07-21
      • 2012-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多