【问题标题】:Check Multiple Values in WHERE Clause SQL Query REGEXP_LIKE Oracle 11g在 WHERE 子句 SQL 查询 REGEXP_LIKE Oracle 11g 中检查多个值
【发布时间】:2018-03-22 05:20:40
【问题描述】:

如果在复杂查询中使用 REGEXP_LIKE 需要很长时间才能执行,您能否为此提供替代解决方案。

从一个查询中获取值列表,并且应该只将这些值用于另一个查询 where 子句

LV_TRANS_TYPES_IDS  VARCHAR2(4000);


  SELECT LISTAGG(TRANSACTION_TYPE_ID, '|') WITHIN GROUP(ORDER BY 1)
    INTO LV_TRANS_TYPES_IDS
    FROM MTL_TRANSACTION_TYPES
   WHERE TRANSACTION_TYPE_NAME IN
         (SELECT MEANING
            FROM FND_LOOKUP_VALUES_VL
           WHERE LOOKUP_TYPE = 'LOOKUPNAME');

-- 它将返回多个值,例如 2|38|45|60

 LV_TRANS_TYPES_IDS := '^(' || LV_TRANS_TYPES_IDS || ')$';

-- 赋值 ^(2|38|45|60)$ 将此值传递给下面的查询

 SELECT COUNT(*)
    INTO LN
    FROM MTL_TRANSACTION_TYPES
   WHERE 1 = 1
     AND REGEXP_LIKE(TRANSACTION_TYPE_ID, LV_TRANS_TYPES_IDS);

首先执行查询获取输出并将这些输出用于第二、第三个查询输入。 like (select f1,f2 from table1 where REGEXP_LIKE(TRANSACTION_TYPE_ID, LV_TRANS_TYPES_IDS) union all union all select f1,f2 from table3 where REGEXP_LIKE(TRANSACTION_TYPE_ID, LV_TRANS_TYPES_IDS))

【问题讨论】:

  • 首先执行查询获取输出并将这些输出用于第二、第三个查询输入。 like (select f1,f2 from table1 where REGEXP_LIKE(TRANSACTION_TYPE_ID, LV_TRANS_TYPES_IDS) union all union all select f1,f2 from table3 where REGEXP_LIKE(TRANSACTION_TYPE_ID, LV_TRANS_TYPES_IDS))

标签: plsql oracle11g regexp-like


【解决方案1】:

如果您想更快地获得结果,请不要使用LISTAGGREGEXP_LIKE

只是:

SELECT COUNT(*)
INTO LN
FROM MTL_TRANSACTION_TYPES
WHERE TRANSACTION_TYPE_NAME IN
         (SELECT MEANING
            FROM FND_LOOKUP_VALUES_VL
           WHERE LOOKUP_TYPE = 'LOOKUPNAME');

【讨论】:

    【解决方案2】:
    SELECT COUNT(*)
    INTO LN
    FROM MTL_TRANSACTION_TYPES mtt
    JOIN
    FND_LOOKUP_VALUES_VL flvv
    ON mtt.TRANSACTION_TYPE_NAME = flvv.MEANING
    AND flvv.LOOKUP_TYPE = 'LOOKUPNAME';
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-17
      • 1970-01-01
      • 1970-01-01
      • 2016-02-27
      • 2011-12-03
      • 2020-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多