【问题标题】:How to create a select statement that satisifies multiple condition from a single column?如何从单个列创建满足多个条件的选择语句?
【发布时间】:2015-06-25 12:31:39
【问题描述】:

这里我有 3 列:ID(NUMBER)、PART_NAME(VARCHAR) 和 PART_VALUE(CLOB)(所有三列都构成一个主键)。我有一个场景,我应该检查同一列的多个条件。 例如:对于特定 ID,我应该检查不同的 Part_Name 及其对应的 part_value。我知道以下是错误的。仅供参考,我包括

SELECT COUNT(0) 
FROM MY_TABLE  
WHERE ID = 'XYZ'
AND (
        (
            (
                PART_TYPE='SW NUT Prod' 
                AND DBMS_LOB.COMPARE(PART_VALUE,'NUT and Non-Standard Key')=0
            ) 
        OR  
            (
                PART_TYPE='SW NUT Prod' 
                AND DBMS_LOB.COMPARE(PART_VALUE,'LIMES Key and Document')=0
            ) 
        OR (
                PART_TYPE='SW NUT Prod' 
                AND DBMS_LOB.COMPARE(PART_VALUE,'LIMES Physical Key and Document')=0
            )
        ) 
        AND (
            PART_TYPE='TRIM' 
            AND DBMS_LOB.COMPARE(PART_VALUE,'FALSE')=0
        ) 
)

我们必须实现这一点。我试过使用自关节。但这并没有帮助,因为我们有非常大的查询,我们应该一次检查 10 个 Part_name。任何建议都会帮助我

【问题讨论】:

  • 我们需要更多信息...您引用的查询会产生什么?桌子长什么样?你能安装一个显示基本表数据的 sqlfiddle 吗?
  • 我将从我的参考查询中获取计数,并根据该值,我必须执行不同的操作。 Sqlfiddlelink
  • 那么这是having 子句可以执行的操作吗?
  • Having 条款无法帮助我猜。它必须满足所有条件..
  • 为什么不能在where 条件下使用having 子句?

标签: oracle oracle11g clob


【解决方案1】:

这些查询可能会有所帮助。它将cnt 列添加到表中的每一行,告知是否满足此id 的所有条件:

with data as (  
  SELECT id, part_type, part_value,  
      case when PART_TYPE='SW NUT Prod' 
        and (DBMS_LOB.COMPARE(PART_VALUE,'NUT and Non-Standard Key')=0 
          or DBMS_LOB.COMPARE(PART_VALUE,'LIMES Key and Document')=0 
          or DBMS_LOB.COMPARE(PART_VALUE,'LIMES Physical Key and Document')=0) 
        then 1 end c1,
      case when PART_TYPE='TRIM' AND DBMS_LOB.COMPARE(PART_VALUE,'FALSE')=0 
        then 1 end c2
    FROM MY_TABLE)
select id, part_type, part_value, case when c1 > 0 and c2 > 0 then 1 else 0 end cnt  
  from (
    select id, part_type, part_value,
        count(c1) over (partition by id) c1, count(c2) over (partition by id) c2 
      from data)

SQLFiddle

出于某种原因,您不需要group by,但您当然可以使用此子句简化输出。 如果您只对特定 id 感兴趣,请在第一个子查询中添加 where id=XYZ。在 SQLFiddle 我添加了第二个 ID, 并非所有条件都满足。

【讨论】:

  • 非常感谢您的思考。只有一个小问题。我只想要一个输出,以便我可以更轻松地进行。这个查询给了我所有的行。你能帮帮我吗?另外请让我知道group by 将如何提供帮助,因为我可能尝试了不同的方法,这导致我遇到了一些性能问题
  • 这是非常小的修改,在第一个子查询中添加where,在主查询中添加distinct,就像在fiddle中一样。
  • -谢谢。它解决了我的问题。你能告诉我如何在这种情况下使用group by。如果我使用group by id,我没有得到想要的 o/p。我也应该按 c1、c2、c3 分组吗? @思考
  • 我很高兴它有帮助。您可以使用group by,但distinct 更好——更易读且更短。 SQLFiddle 有例子。
猜你喜欢
  • 1970-01-01
  • 2011-11-03
  • 1970-01-01
  • 2013-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-11
  • 2020-09-08
相关资源
最近更新 更多